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.
}
rcu_register_thread();
- isc__thread_initialize();
isc__os_initialize();
isc__mutex_initialize();
isc__mem_initialize();
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();
}
#include "async_p.h"
#include "job_p.h"
#include "loop_p.h"
+#include "thread_p.h"
/**
* Private
*/
ignore_signal(SIGPIPE, SIG_IGN);
+ isc__thread_initialize();
+
/*
* The thread 0 is this one.
*/
isc_barrier_destroy(&loopmgr->pausing);
isc_mem_putanddetach(&loopmgr->mctx, loopmgr, sizeof(*loopmgr));
+
+ isc__thread_shutdown();
}
uint32_t