From: Roy Marples Date: Tue, 16 Feb 2021 16:43:18 +0000 (+0000) Subject: eloop: delete events from kqueue/epoll directly X-Git-Tag: v10.0.0~99 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f322b5a1ae427c3f8be08448564ee5b1b5ef6683;p=thirdparty%2Fdhcpcd.git eloop: delete events from kqueue/epoll directly Rather than relying on close(2) being called. Whilst a bit less performant with many open/close, there is also no guarantee that close(2) will actually be called as shutdown(2) could be used instead. --- diff --git a/src/eloop.c b/src/eloop.c index 32042c54..0e7aac8a 100644 --- a/src/eloop.c +++ b/src/eloop.c @@ -404,6 +404,10 @@ int eloop_event_delete(struct eloop *eloop, int fd) { struct eloop_event *e; +#if defined(HAVE_KQUEUE) + struct kevent ke[2], *kep = &ke[0]; + size_t n; +#endif assert(eloop != NULL); if (fd == -1) { @@ -420,6 +424,22 @@ eloop_event_delete(struct eloop *eloop, int fd) return -1; } +#if defined(HAVE_KQUEUE) + n = 0; + if (e->events & ELE_READ) { + EV_SET(kep++, (uintptr_t)fd, EVFILT_READ, EV_DELETE, 0, 0, e); + n++; + } + if (e->events & ELE_WRITE) { + EV_SET(kep++, (uintptr_t)fd, EVFILT_WRITE, EV_DELETE, 0, 0, e); + n++; + } + if (n != 0 && _kevent(eloop->fd, ke, n, NULL, 0, NULL) == -1) + return -1; +#elif defined(HAVE_EPOLL) + if (epoll_ctl(eloop->fd, EPOLL_CTL_DEL, fd, NULL) == -1) + return -1; +#endif e->fd = -1; eloop->nevents--; eloop->events_need_setup = true; @@ -954,7 +974,7 @@ eloop_run_kqueue(struct eloop *eloop, const struct timespec *ts) return -1; for (nn = n, ke = eloop->fds; nn != 0; nn--, ke++) { - if (eloop->cleared) + if (eloop->cleared || eloop->exitnow) break; e = (struct eloop_event *)ke->udata; if (ke->filter == EVFILT_SIGNAL) { @@ -1009,7 +1029,7 @@ eloop_run_epoll(struct eloop *eloop, return -1; for (nn = n, epe = eloop->fds; nn != 0; nn--, epe++) { - if (eloop->cleared) + if (eloop->cleared || eloop->exitnow) break; e = (struct eloop_event *)epe->data.ptr; if (e->fd == -1) @@ -1045,7 +1065,7 @@ eloop_run_ppoll(struct eloop *eloop, nn = n; TAILQ_FOREACH(e, &eloop->events, next) { - if (eloop->cleared) + if (eloop->cleared || eloop->exitnow) break; /* Skip freshly added events */ if ((pfd = e->pollfd) == NULL) @@ -1107,7 +1127,7 @@ eloop_run_pselect(struct eloop *eloop, return n; TAILQ_FOREACH(e, &eloop->events, next) { - if (eloop->cleared) + if (eloop->cleared || eloop->exitnow) break; if (e->fd == -1) continue;