detect kqueue bug in Mac OS X 10.4; from Nick Mathewson

svn:r165
This commit is contained in:
Niels Provos 2005-05-11 03:34:42 +00:00
parent 145c11fd6d
commit 57fafe6b5f

View File

@ -122,6 +122,27 @@ kq_init(void)
} }
kqueueop->nevents = NEVENT; kqueueop->nevents = NEVENT;
/* Check for Mac OS X kqueue bug. */
kqueueop->changes[0].ident = -1;
kqueueop->changes[0].filter = EVFILT_READ;
kqueueop->changes[0].flags = EV_ADD;
/*
* If kqueue works, then kevent will succeed, and it will
* stick an error in events[0]. If kqueue is broken, then
* kevent will fail.
*/
if (kevent(kq,
kqueueop->changes, 1, kqueueop->events, NEVENT, NULL) != 1 ||
kqueueop->events[0].ident != -1 ||
kqueueop->events[0].flags != EV_ERROR) {
event_warn("%s: detected broken kqueue; not using.", __func__);
free(kqueueop->changes);
free(kqueueop->events);
free(kqueueop);
close(kq);
return (NULL);
}
return (kqueueop); return (kqueueop);
} }