Mercurial > hg > dhcpcd
changeset 2990:e329d287187c draft
Set poll filters before writing eloop event.
| author | Roy Marples <roy@marples.name> |
|---|---|
| date | Thu, 05 Mar 2015 11:34:47 +0000 |
| parents | 1fd4d6b25337 |
| children | c97ce8019371 |
| files | eloop.c |
| diffstat | 1 files changed, 21 insertions(+), 16 deletions(-) [+] |
line wrap: on
line diff
--- a/eloop.c Thu Mar 05 03:30:14 2015 +0000 +++ b/eloop.c Thu Mar 05 11:34:47 2015 +0000 @@ -107,6 +107,26 @@ /* We should only have one callback monitoring the fd */ TAILQ_FOREACH(e, &ctx->events, next) { if (e->fd == fd) { + int error; + +#if defined(HAVE_KQUEUE) + EV_SET(&ke[0], fd, EVFILT_READ, EV_ADD, 0, 0, UPTR(e)); + if (write_cb) + EV_SET(&ke[1], fd, EVFILT_WRITE, EV_ADD, + 0, 0, UPTR(e)); + else if (e->write_cb) + EV_SET(&ke[1], fd, EVFILT_WRITE, EV_DELETE, + 0, 0, UPTR(e)); + error = kevent(ctx->poll_fd, ke, + e->write_cb || write_cb ? 2 : 1, NULL, 0, NULL); + goto err; +#elif defined(HAVE_EPOLL) + epe.data.ptr = e; + error = epoll_ctl(ctx->poll_fd, EPOLL_CTL_MOD, + fd, &epe); +#else + error = 0; +#endif if (read_cb) { e->read_cb = read_cb; e->read_cb_arg = read_cb_arg; @@ -115,23 +135,8 @@ e->write_cb = write_cb; e->write_cb_arg = write_cb_arg; } -#if defined(HAVE_KQUEUE) - EV_SET(&ke[0], fd, EVFILT_READ, EV_ADD, 0, 0, UPTR(e)); - if (write_cb) - EV_SET(&ke[1], fd, EVFILT_WRITE, EV_ADD, - 0, 0, UPTR(e)); - if (kevent(ctx->poll_fd, ke, write_cb ? 2 : 1, - NULL, 0, NULL) == -1) - goto err; - return 0; -#elif defined(HAVE_EPOLL) - epe.data.ptr = e; - return epoll_ctl(ctx->poll_fd, EPOLL_CTL_MOD, - fd, &epe); -#else eloop_event_setup_fds(ctx); - return 0; -#endif + return error; } }
