summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoy Marples <roy@marples.name>2021-01-29 11:13:43 +0000
committerRoy Marples <roy@marples.name>2021-01-29 11:13:43 +0000
commita9cb061e3832a381b02bd9927daf5ef7a2adce66 (patch)
tree142794e94f5d81f60813d4cda8f2c4b29d73c806
parent14d3b511ee71c1fb39e383949384a7a43fac0263 (diff)
downloaddhcpcd-a9cb061e3832a381b02bd9927daf5ef7a2adce66.tar.xz
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.
-rw-r--r--src/eloop.c17
1 files 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);