From: Roy Marples Date: Fri, 29 Jan 2021 11:13:43 +0000 (+0000) Subject: eloop: Always free the pollfd buffer when clearing events X-Git-Tag: v10.0.0~129 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a9cb061e3832a381b02bd9927daf5ef7a2adce66;p=thirdparty%2Fdhcpcd.git eloop: Always free the pollfd buffer when clearing events And set the flag to re-create it before the next run. This allows us to always ensure it's small if the prior run used more signals and fds. --- diff --git a/src/eloop.c b/src/eloop.c index 834af968..f1b90bef 100644 --- a/src/eloop.c +++ b/src/eloop.c @@ -940,9 +940,6 @@ eloop_clear(struct eloop *eloop, ...) if (eloop == NULL) return; - eloop->signals = NULL; - eloop->nsignals = 0; - va_start(va1, eloop); TAILQ_FOREACH_SAFE(e, &eloop->events, next, ne) { va_copy(va2, va1); @@ -960,12 +957,14 @@ eloop_clear(struct eloop *eloop, ...) free(e); } va_end(va1); - if (TAILQ_FIRST(&eloop->events) == NULL) { - free(eloop->fds); - eloop->fds = NULL; - eloop->nfds = 0; - } else - eloop->events_need_setup = true; + + /* Free the pollfd buffer and ensure it's re-created before + * the next run. This allows us to shrink it incase we use a lot less + * signals and fds to respond to after forking. */ + free(eloop->fds); + eloop->fds = NULL; + eloop->nfds = 0; + eloop->events_need_setup = true; while ((e = TAILQ_FIRST(&eloop->free_events))) { TAILQ_REMOVE(&eloop->free_events, e, next);