diff -r 67fbf09d3fa5 src/lib/ioloop-kqueue.c --- a/src/lib/ioloop-kqueue.c Wed Nov 10 16:09:14 2010 +0000 +++ b/src/lib/ioloop-kqueue.c Sun Nov 14 18:09:46 2010 +0000 @@ -6,7 +6,7 @@ #include "lib.h" -#ifdef IOLOOP_KQUEUE +#ifndef IOLOOP_KQUEUE #include "array.h" #include "fd-close-on-exec.h" @@ -125,8 +125,22 @@ /* wait for events */ events = array_get_modifiable(&ctx->events, &events_count); ret = kevent (ctx->kq, NULL, 0, events, events_count, &ts); - if (ret < 0 && errno != EINTR) - i_fatal("kevent(): %m"); + if (ret < 0 && errno != EINTR) { + memset(&ts, 0, sizeof(ts)); + if (kevent (ctx->kq, NULL, 0, events, events_count, &ts) == 0) + i_fatal("kevent: invalid timespec"); + for (i = 0; i < (int)events_count; i++) { + struct kevent *e = &events[i]; + io = (void *)e->udata; + + if (kevent(ctx->kq, NULL, 0, e, 1, &ts) < 0) { + i_panic("kevent: invalid event: ident=%p filter=%d flags=%u fflags=%u fd=%d callback=%p", + (void *)e->ident, e->filter, e->flags, e->fflags, + io->fd, io->io.callback); + } + } + i_panic("kevent(): dunno why it broke"); + } /* reference all IOs */ for (i = 0; i < ret; i++) {