]> git.ipfire.org Git - thirdparty/dhcpcd.git/commitdiff
eloop: Always free the pollfd buffer when clearing events
authorRoy Marples <roy@marples.name>
Fri, 29 Jan 2021 11:13:43 +0000 (11:13 +0000)
committerRoy Marples <roy@marples.name>
Fri, 29 Jan 2021 11:13:43 +0000 (11:13 +0000)
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

index 834af9683b8b29f3f0a53be3e9a907196c718c1e..f1b90bef559d3b83aeae8a6577823a44957f608c 100644 (file)
@@ -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);