From: Roy Marples Date: Mon, 10 Nov 2025 19:44:01 +0000 (+0000) Subject: eloop: for kqueue and epoll, grow the receiving event list as needed. X-Git-Tag: v10.3.0~19 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c2068c057b3093f35f3d422025c139d3accf78d4;p=thirdparty%2Fdhcpcd.git eloop: for kqueue and epoll, grow the receiving event list as needed. --- diff --git a/src/eloop.c b/src/eloop.c index ded1624e..e53fc106 100644 --- a/src/eloop.c +++ b/src/eloop.c @@ -173,16 +173,9 @@ static int eloop_event_setup_fds(struct eloop *eloop) { struct eloop_event *e, *ne; -#if defined(USE_KQUEUE) - struct kevent *pfd; - size_t nfds = eloop->nsignals; -#elif defined(USE_EPOLL) - struct epoll_event *pfd; - size_t nfds = 0; -#elif defined(USE_PPOLL) +#ifdef USE_PPOLL struct pollfd *pfd; size_t nfds = 0; -#endif nfds += eloop->nevents; if (nfds > eloop->nfds) { @@ -192,10 +185,9 @@ eloop_event_setup_fds(struct eloop *eloop) eloop->fds = pfd; eloop->nfds = nfds; } - -#ifdef USE_PPOLL pfd = eloop->fds; #endif + TAILQ_FOREACH_SAFE(e, &eloop->events, next, ne) { if (e->fd == -1) { TAILQ_REMOVE(&eloop->events, e, next); @@ -219,6 +211,26 @@ eloop_event_setup_fds(struct eloop *eloop) return 0; } +#ifndef USE_PPOLL +static int +eloop_grow_events(struct eloop *eloop) +{ +#if defined(USE_KQUEUE) + struct kevent *pfd; +#elif defined(USE_EPOLL) + struct epoll_event *pfd; +#endif + size_t nfds = eloop->nfds == 0 ? 4 : eloop->nfds * 2; + + pfd = eloop_realloca(eloop->fds, nfds, sizeof(*pfd)); + if (pfd == NULL) + return -1; + eloop->fds = pfd; + eloop->nfds = nfds; + return 0; +} +#endif + size_t eloop_event_count(const struct eloop *eloop) { @@ -832,7 +844,7 @@ eloop_new(void) eloop->exitcode = EXIT_FAILURE; #if defined(USE_KQUEUE) || defined(USE_EPOLL) - if (eloop_open(eloop) == -1) { + if (eloop_open(eloop) == -1 || eloop_grow_events(eloop) == -1) { eloop_free(eloop); return NULL; } @@ -917,6 +929,9 @@ eloop_run_kqueue(struct eloop *eloop, const struct timespec *ts) events |= ELE_ERROR; e->cb(e->cb_arg, events); } + + if ((size_t)n == eloop->nfds) + eloop_grow_events(eloop); return n; } @@ -963,6 +978,9 @@ eloop_run_epoll(struct eloop *eloop, const struct timespec *ts) events |= ELE_ERROR; e->cb(e->cb_arg, events); } + + if ((size_t)n == eloop->nfds) + eloop_grow_events(eloop); return n; }