From a9cb061e3832a381b02bd9927daf5ef7a2adce66 Mon Sep 17 00:00:00 2001 From: Roy Marples Date: Fri, 29 Jan 2021 11:13:43 +0000 Subject: [PATCH] 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. --- src/eloop.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) 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); -- 2.47.2