From 30d49393822fd85173f730feedffd7c2cf5c5edc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Sur=C3=BD?= Date: Tue, 15 Apr 2025 23:04:14 +0200 Subject: [PATCH] Move the call_rcu_thread explicit create and shutdown to isc_loop When isc__thread_initialize() is called from a library constructor, it could be called before we fork the main process. This happens with named, and then we have the call_rcu_thread attached to the pre-fork process and not the post-fork process, which means that the initial process will never shutdown, because there's noone to tell it so. Move the isc__thread_initialize() and isc__thread_shutdown() to the isc_loop unit where we call it before creating the extra thread and after joining all the extra threads respectively. --- lib/isc/lib.c | 2 -- lib/isc/loop.c | 5 +++++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/isc/lib.c b/lib/isc/lib.c index db3918a5e2..bdff8efd35 100644 --- a/lib/isc/lib.c +++ b/lib/isc/lib.c @@ -49,7 +49,6 @@ isc__lib_initialize(void) { } rcu_register_thread(); - isc__thread_initialize(); isc__os_initialize(); isc__mutex_initialize(); isc__mem_initialize(); @@ -76,7 +75,6 @@ isc__lib_shutdown(void) { isc__mem_shutdown(); isc__mutex_shutdown(); isc__os_shutdown(); - isc__thread_shutdown(); /* should be after isc__mem_shutdown() which calls rcu_barrier() */ rcu_unregister_thread(); } diff --git a/lib/isc/loop.c b/lib/isc/loop.c index c1f2b540b5..1c7cacb202 100644 --- a/lib/isc/loop.c +++ b/lib/isc/loop.c @@ -40,6 +40,7 @@ #include "async_p.h" #include "job_p.h" #include "loop_p.h" +#include "thread_p.h" /** * Private @@ -497,6 +498,8 @@ isc_loopmgr_run(isc_loopmgr_t *loopmgr) { */ ignore_signal(SIGPIPE, SIG_IGN); + isc__thread_initialize(); + /* * The thread 0 is this one. */ @@ -619,6 +622,8 @@ isc_loopmgr_destroy(isc_loopmgr_t **loopmgrp) { isc_barrier_destroy(&loopmgr->pausing); isc_mem_putanddetach(&loopmgr->mctx, loopmgr, sizeof(*loopmgr)); + + isc__thread_shutdown(); } uint32_t