diff --git a/src/ev_epoll.c b/src/ev_epoll.c index a2e5e0a60..9e72802dc 100644 --- a/src/ev_epoll.c +++ b/src/ev_epoll.c @@ -139,7 +139,6 @@ REGPRM2 static void _do_poll(struct poller *p, int exp) /* it looks complicated but gcc can optimize it away when constants * have same values... In fact it depends on gcc :-( */ - fdtab[fd].ev &= FD_POLL_STICKY; if (EPOLLIN == FD_POLL_IN && EPOLLOUT == FD_POLL_OUT && EPOLLPRI == FD_POLL_PRI && EPOLLERR == FD_POLL_ERR && EPOLLHUP == FD_POLL_HUP) { @@ -158,13 +157,7 @@ REGPRM2 static void _do_poll(struct poller *p, int exp) cur_poller.flags |= HAP_POLL_F_RDHUP; n |= FD_POLL_HUP; } - - fdtab[fd].ev |= n; - if (fdtab[fd].ev & (FD_POLL_IN | FD_POLL_HUP | FD_POLL_ERR)) - fd_may_recv(fd); - - if (fdtab[fd].ev & (FD_POLL_OUT | FD_POLL_ERR)) - fd_may_send(fd); + fd_update_events(fd, n); } /* the caller will take care of cached events */ } diff --git a/src/ev_kqueue.c b/src/ev_kqueue.c index f1c0b8d00..02723cca6 100644 --- a/src/ev_kqueue.c +++ b/src/ev_kqueue.c @@ -117,30 +117,25 @@ REGPRM2 static void _do_poll(struct poller *p, int exp) measure_idle(); for (count = 0; count < status; count++) { + unsigned int n = 0; fd = kev[count].ident; if (!fdtab[fd].owner) continue; - fdtab[fd].ev &= FD_POLL_STICKY; - if (kev[count].filter == EVFILT_READ) { if (kev[count].data) - fdtab[fd].ev |= FD_POLL_IN; + n |= FD_POLL_IN; if (kev[count].flags & EV_EOF) - fdtab[fd].ev |= FD_POLL_HUP; + n |= FD_POLL_HUP; } else if (kev[count].filter == EVFILT_WRITE) { - fdtab[fd].ev |= FD_POLL_OUT; + n |= FD_POLL_OUT; if (kev[count].flags & EV_EOF) - fdtab[fd].ev |= FD_POLL_ERR; + n |= FD_POLL_ERR; } - if (fdtab[fd].ev & (FD_POLL_IN | FD_POLL_HUP | FD_POLL_ERR)) - fd_may_recv(fd); - - if (fdtab[fd].ev & (FD_POLL_OUT | FD_POLL_ERR)) - fd_may_send(fd); + fd_update_events(fd, n); } } diff --git a/src/ev_poll.c b/src/ev_poll.c index 90ac9e5e1..1cb8d2d62 100644 --- a/src/ev_poll.c +++ b/src/ev_poll.c @@ -132,6 +132,7 @@ REGPRM2 static void _do_poll(struct poller *p, int exp) measure_idle(); for (count = 0; status > 0 && count < nbfd; count++) { + unsigned int n; int e = poll_events[count].revents; fd = poll_events[count].fd; @@ -147,14 +148,12 @@ REGPRM2 static void _do_poll(struct poller *p, int exp) /* it looks complicated but gcc can optimize it away when constants * have same values... In fact it depends on gcc :-( */ - fdtab[fd].ev &= FD_POLL_STICKY; if (POLLIN == FD_POLL_IN && POLLOUT == FD_POLL_OUT && POLLERR == FD_POLL_ERR && POLLHUP == FD_POLL_HUP) { - fdtab[fd].ev |= e & (POLLIN|POLLOUT|POLLERR|POLLHUP); + n = e & (POLLIN|POLLOUT|POLLERR|POLLHUP); } else { - fdtab[fd].ev |= - ((e & POLLIN ) ? FD_POLL_IN : 0) | + n = ((e & POLLIN ) ? FD_POLL_IN : 0) | ((e & POLLOUT) ? FD_POLL_OUT : 0) | ((e & POLLERR) ? FD_POLL_ERR : 0) | ((e & POLLHUP) ? FD_POLL_HUP : 0); @@ -163,14 +162,10 @@ REGPRM2 static void _do_poll(struct poller *p, int exp) /* always remap RDHUP to HUP as they're used similarly */ if (e & POLLRDHUP) { cur_poller.flags |= HAP_POLL_F_RDHUP; - fdtab[fd].ev |= FD_POLL_HUP; + n |= FD_POLL_HUP; } - if (fdtab[fd].ev & (FD_POLL_IN | FD_POLL_HUP | FD_POLL_ERR)) - fd_may_recv(fd); - - if (fdtab[fd].ev & (FD_POLL_OUT | FD_POLL_ERR)) - fd_may_send(fd); + fd_update_events(fd, n); } } diff --git a/src/ev_select.c b/src/ev_select.c index 1b40ea102..cf80ac856 100644 --- a/src/ev_select.c +++ b/src/ev_select.c @@ -129,24 +129,21 @@ REGPRM2 static void _do_poll(struct poller *p, int exp) continue; for (count = BITS_PER_INT, fd = fds * BITS_PER_INT; count && fd < maxfd; count--, fd++) { + unsigned int n = 0; + /* if we specify read first, the accepts and zero reads will be * seen first. Moreover, system buffers will be flushed faster. */ if (!fdtab[fd].owner) continue; - fdtab[fd].ev &= FD_POLL_STICKY; if (FD_ISSET(fd, tmp_evts[DIR_RD])) - fdtab[fd].ev |= FD_POLL_IN; + n |= FD_POLL_IN; if (FD_ISSET(fd, tmp_evts[DIR_WR])) - fdtab[fd].ev |= FD_POLL_OUT; + n |= FD_POLL_OUT; - if (fdtab[fd].ev & (FD_POLL_IN | FD_POLL_HUP | FD_POLL_ERR)) - fd_may_recv(fd); - - if (fdtab[fd].ev & (FD_POLL_OUT | FD_POLL_ERR)) - fd_may_send(fd); + fd_update_events(fd, n); } } }