Fix: call_rcu: teardown default call_rcu worker on application exit
[urcu.git] / src / urcu-bp.c
index 33f280799208c66f0337e25acfeaf8adce213aa1..35ac9dbed12b01e19166e93e5f176a9c2dc490da 100644 (file)
@@ -37,6 +37,7 @@
 #include <stdbool.h>
 #include <sys/mman.h>
 
+#include <urcu/config.h>
 #include <urcu/arch.h>
 #include <urcu/wfcqueue.h>
 #include <urcu/map/urcu-bp.h>
@@ -74,8 +75,10 @@ void *mremap_wrapper(void *old_address, size_t old_size,
  * This is not generic.
 */
 static
-void *mremap_wrapper(void *old_address, size_t old_size,
-               size_t new_size, int flags)
+void *mremap_wrapper(void *old_address __attribute__((unused)),
+               size_t old_size __attribute__((unused)),
+               size_t new_size __attribute__((unused)),
+               int flags)
 {
        assert(!(flags & MREMAP_MAYMOVE));
 
@@ -118,6 +121,7 @@ static
 void __attribute__((constructor)) _urcu_bp_init(void);
 static
 void __attribute__((destructor)) urcu_bp_exit(void);
+static void urcu_call_rcu_exit(void);
 
 #ifndef CONFIG_RCU_FORCE_SYS_MEMBARRIER
 int urcu_bp_has_sys_membarrier;
@@ -566,6 +570,12 @@ end:
 }
 URCU_ATTR_ALIAS("urcu_bp_register") void rcu_bp_register();
 
+void urcu_bp_register_thread(void)
+{
+       if (caa_unlikely(!URCU_TLS(urcu_bp_reader)))
+               urcu_bp_register(); /* If not yet registered. */
+}
+
 /* Disable signals, take mutex, remove from registry */
 static
 void urcu_bp_unregister(struct rcu_reader *rcu_reader_reg)
@@ -653,6 +663,8 @@ void _urcu_bp_init(void)
 static
 void urcu_bp_exit(void)
 {
+       urcu_call_rcu_exit();
+
        mutex_lock(&init_lock);
        if (!--urcu_bp_refcount) {
                struct registry_chunk *chunk, *tmp;
This page took 0.025625 seconds and 4 git commands to generate.