diff --git a/io/io_waituntil2.c b/io/io_waituntil2.c index a3a14b5..8e00fe7 100644 --- a/io/io_waituntil2.c +++ b/io/io_waituntil2.c @@ -265,19 +265,22 @@ int64 io_waituntil2(int64 milliseconds) { for (i=n-1; i>=0; --i) { io_entry* e=iarray_get(&io_fds,y[--n].ident); if (e) { - /* copies from epoll above */ - int curevents=0,newevents; - if (e->kernelwantread) curevents |= EVFILT_READ; - if (e->kernelwantwrite) curevents |= EVFILT_WRITE; + struct kevent kev[4]; + int nkev=0; + + int curevents=0,newevents=0; + if (e->kernelwantread) curevents |= POLLIN; + if (e->kernelwantwrite) curevents |= POLLOUT; - newevents=0; if (!e->canread || e->wantread) { - newevents |= EVFILT_READ; + newevents |= POLLIN; + EV_SET(kev, n, EVFILT_READ, EV_ADD|EV_ENABLE, 0, 0, 0); ++n; e->kernelwantread=1; } else e->kernelwantread=0; if (!e->canwrite || e->wantwrite) { - newevents |= EVFILT_WRITE; + newevents |= POLLOUT; + EV_SET(kev+nkev, n, EVFILT_WRITE, EV_ADD|EV_ENABLE, 0, 0, 0); ++nkev; e->kernelwantwrite=1; } else e->kernelwantwrite=0; @@ -292,7 +295,8 @@ int64 io_waituntil2(int64 milliseconds) { * can, put this fd in the relevant data structures */ if (!e->canread && (y[n].filter&EVFILT_WRITE)) { if (e->canread) { - newevents &= ~EVFILT_READ; + newevents &= ~POLLIN; + EV_SET(kev+nkev, n, EVFILT_READ, EV_DELETE, 0, 0, 0); ++nkev; } else { e->canread=1; if (e->wantread) { @@ -316,7 +320,8 @@ int64 io_waituntil2(int64 milliseconds) { * some kind of throttling and we can tell the kernel to leave * us alone for now. */ if (e->canwrite) { - newevents &= ~EVFILT_WRITE; + newevents &= ~POLLOUT; + EV_SET(kev+nkev, n, EVFILT_WRITE, EV_DELETE, 0, 0, 0); ++nkev; e->kernelwantwrite=0; } else { /* If !e->wantwrite: The laziness optimization in @@ -333,17 +338,9 @@ int64 io_waituntil2(int64 milliseconds) { } if (newevents != curevents) { - struct kevent kev; struct timespec ts; ts.tv_sec=0; ts.tv_nsec=0; - if (curevents &~ newevents) { - EV_SET(&kev, n, curevents &~ newevents, EV_DELETE, 0, 0, 0); - kevent(io_master,&kev,1,0,0,&ts); - } - if (newevents &~ curevents) { - EV_SET(&kev, n, newevents, EV_ADD|EV_ENABLE, 0, 0, 0); - kevent(io_master,&kev,1,0,0,&ts); - } + kevent(io_master, kev, nkev, 0, 0, &ts); if (!newevents) --io_wanted_fds; }