X-Git-Url: https://git.liburcu.org/?a=blobdiff_plain;f=src%2Furcu-bp.c;h=35ac9dbed12b01e19166e93e5f176a9c2dc490da;hb=129e1dd6dbd0c9bf3785a7704356cd61522b6043;hp=0653f9dff769b89281d5ec2edf4608d5604edbdf;hpb=ce28e67a534dcf0b68ccad2218e5a2e552e6e469;p=urcu.git diff --git a/src/urcu-bp.c b/src/urcu-bp.c index 0653f9d..35ac9db 100644 --- a/src/urcu-bp.c +++ b/src/urcu-bp.c @@ -23,6 +23,7 @@ * IBM's contributions to this file may be relicensed under LGPLv2 or later. */ +#define URCU_NO_COMPAT_IDENTIFIERS #define _LGPL_SOURCE #include #include @@ -36,6 +37,7 @@ #include #include +#include #include #include #include @@ -73,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)); @@ -117,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; @@ -151,8 +156,7 @@ URCU_ATTR_ALIAS("urcu_bp_gp") extern struct urcu_bp_gp rcu_gp_bp; * by both the reader and the writers. */ DEFINE_URCU_TLS(struct urcu_bp_reader *, urcu_bp_reader); -URCU_ATTR_ALIAS("urcu_bp_reader") -extern struct urcu_bp_reader *rcu_reader_bp; +DEFINE_URCU_TLS_ALIAS(struct urcu_bp_reader *, urcu_bp_reader, rcu_reader_bp); static CDS_LIST_HEAD(registry); @@ -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;