]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Move the call_rcu_thread explicit create and shutdown to isc_loop
authorOndřej Surý <ondrej@isc.org>
Tue, 15 Apr 2025 21:04:14 +0000 (23:04 +0200)
committerOndřej Surý <ondrej@isc.org>
Wed, 16 Apr 2025 10:30:14 +0000 (12:30 +0200)
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
lib/isc/loop.c

index db3918a5e22bc25b71e7f735e99856a784254108..bdff8efd3582e4656c71af192f9a5af7e577e879 100644 (file)
@@ -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();
 }
index c1f2b540b5e0e2e2a5996c07e66d91a9cf1c4b49..1c7cacb202b2dec4b1aef1a17aba85182010fd48 100644 (file)
@@ -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