diff options
Diffstat (limited to 'src/fdevent_poll.c')
-rw-r--r-- | src/fdevent_poll.c | 44 |
1 files changed, 22 insertions, 22 deletions
diff --git a/src/fdevent_poll.c b/src/fdevent_poll.c index c53b3935..d88cd743 100644 --- a/src/fdevent_poll.c +++ b/src/fdevent_poll.c @@ -115,14 +115,7 @@ static int fdevent_poll_event_set(fdevents *ev, int fde_ndx, int fd, int events) } } -static int fdevent_poll_poll(fdevents *ev, int timeout_ms) { -#if 0 - fdevent_poll_event_compress(ev); -#endif - return poll(ev->pollfds, ev->used, timeout_ms); -} - -static int fdevent_poll_event_get_revent(fdevents *ev, size_t ndx) { +static int fdevent_poll_event_get_revent(const fdevents *ev, size_t ndx) { int r, poll_r; if (ndx >= ev->used) { @@ -155,21 +148,32 @@ static int fdevent_poll_event_get_revent(fdevents *ev, size_t ndx) { return r; } -static int fdevent_poll_event_get_fd(fdevents *ev, size_t ndx) { - return ev->pollfds[ndx].fd; -} - -static int fdevent_poll_event_next_fdndx(fdevents *ev, int ndx) { - size_t i; - - i = (ndx < 0) ? 0 : ndx + 1; - for (; i < ev->used; i++) { +static int fdevent_poll_event_next_fdndx(const fdevents *ev, int ndx) { + for (size_t i = (size_t)(ndx+1); i < ev->used; ++i) { if (ev->pollfds[i].revents) return i; } - return -1; } +static int fdevent_poll_poll(fdevents *ev, int timeout_ms) { + #if 0 + fdevent_poll_event_compress(ev); + #endif + int n = poll(ev->pollfds, ev->used, timeout_ms); + server * const srv = ev->srv; + for (int ndx = -1, i = 0; i < n; ++i) { + fdnode *fdn; + ndx = fdevent_poll_event_next_fdndx(ev, ndx); + if (-1 == ndx) continue; + fdn = ev->fdarray[ndx]; + if (0 == ((uintptr_t)fdn & 0x3)) { + int revents = fdevent_poll_event_get_revent(ev, i); + (*fdn->handler)(srv, fdn->ctx, revents); + } + } + return n; +} + int fdevent_poll_init(fdevents *ev) { ev->type = FDEVENT_HANDLER_POLL; #define SET(x) \ @@ -181,10 +185,6 @@ int fdevent_poll_init(fdevents *ev) { SET(event_del); SET(event_set); - SET(event_next_fdndx); - SET(event_get_fd); - SET(event_get_revent); - return 0; } |