Index: io/iom_wait.c --- io/iom_wait.c.orig +++ io/iom_wait.c @@ -29,13 +29,13 @@ int iom_wait(iomux_t* c,int64* s,unsigned int* revents /* The queue was empty. If someone else is already calling * epoll_wait/kevent, then use the semaphore */ if (__sync_bool_compare_and_swap(&c->working,0,1)) { + int i; /* we have the job to fill the struct. */ int freeslots = (c->h - c->l); if (!freeslots) freeslots=SLOTS; #ifdef HAVE_EPOLL struct epoll_event ee[SLOTS]; - int i; r=epoll_wait(c->ctx, ee, freeslots, timeout); if (r<=0) { /* we ran into a timeout, so let someone else take over */ @@ -65,7 +65,7 @@ int iom_wait(iomux_t* c,int64* s,unsigned int* revents #elif defined(HAVE_KQUEUE) struct kevent kev[SLOTS]; struct timespec ts = { .tv_sec=timeout/1000, .tv_nsec=(timeout%1000)*1000000 }; - int r=kevent(c->ctx, 0, 0, &kev, freeslots, &ts); + int r=kevent(c->ctx, 0, 0, kev, freeslots, &ts); if (r<=0) { /* we ran into a timeout, so let someone else take over */ if (__sync_val_compare_and_swap(&c->working,1,0)==-2) return -2; @@ -82,7 +82,7 @@ int iom_wait(iomux_t* c,int64* s,unsigned int* revents (kev[i].filter == EVFILT_WRITE ? IOM_WRITE : 0); if (i+1==r) { /* return last event instead of enqueueing it */ - *s=kev.ident; + *s=kev[i].ident; *revents=e; } else { c->q[c->h].fd=kev[i].ident;