X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Furcu.c;h=902b8f839a75b4df7e0b077ed780a2f0b0c4a433;hb=f99c6e92aaa1582e6cd19d93d44d91d968f39aa7;hp=c47f51b53330322468cd5a6b870eab612907fb68;hpb=c0bb9f693f926595a7cb8b4ce712cef08d9f5d49;p=userspace-rcu.git diff --git a/src/urcu.c b/src/urcu.c index c47f51b..902b8f8 100644 --- a/src/urcu.c +++ b/src/urcu.c @@ -23,6 +23,7 @@ * IBM's contributions to this file may be relicensed under LGPLv2 or later. */ +#define URCU_NO_COMPAT_IDENTIFIERS #define _BSD_SOURCE #define _LGPL_SOURCE #define _DEFAULT_SOURCE @@ -37,19 +38,22 @@ #include #include -#include "urcu/arch.h" -#include "urcu/wfcqueue.h" -#include "urcu/map/urcu.h" -#include "urcu/static/urcu.h" -#include "urcu-pointer.h" -#include "urcu/tls-compat.h" +#include +#include +#include +#include +#include +#include +#include #include "urcu-die.h" #include "urcu-wait.h" +#include "urcu-utils.h" +#define URCU_API_MAP /* Do not #define _LGPL_SOURCE to ensure we can emit the wrapper symbols */ #undef _LGPL_SOURCE -#include "urcu.h" +#include #define _LGPL_SOURCE /* @@ -82,10 +86,14 @@ enum membarrier_cmd { #ifdef RCU_MEMBARRIER static int init_done; -static int has_sys_membarrier_private_expedited; +static int urcu_memb_has_sys_membarrier_private_expedited; #ifndef CONFIG_RCU_FORCE_SYS_MEMBARRIER -int rcu_has_sys_membarrier_memb; +/* + * Explicitly initialize to zero because we can't alias a non-static + * uninitialized variable. + */ +int urcu_memb_has_sys_membarrier = 0; #endif void __attribute__((constructor)) rcu_init(void); @@ -119,13 +127,13 @@ static pthread_mutex_t rcu_gp_lock = PTHREAD_MUTEX_INITIALIZER; * rcu_registry_lock may nest inside rcu_gp_lock. */ static pthread_mutex_t rcu_registry_lock = PTHREAD_MUTEX_INITIALIZER; -struct rcu_gp rcu_gp = { .ctr = RCU_GP_COUNT }; +struct urcu_gp rcu_gp = { .ctr = URCU_GP_COUNT }; /* * Written to only by each individual reader. Read by both the reader and the * writers. */ -DEFINE_URCU_TLS(struct rcu_reader, rcu_reader); +DEFINE_URCU_TLS(struct urcu_reader, rcu_reader); static CDS_LIST_HEAD(registry); @@ -169,8 +177,8 @@ static void mutex_unlock(pthread_mutex_t *mutex) #ifdef RCU_MEMBARRIER static void smp_mb_master(void) { - if (caa_likely(rcu_has_sys_membarrier_memb)) { - if (membarrier(has_sys_membarrier_private_expedited ? + if (caa_likely(urcu_memb_has_sys_membarrier)) { + if (membarrier(urcu_memb_has_sys_membarrier_private_expedited ? MEMBARRIER_CMD_PRIVATE_EXPEDITED : MEMBARRIER_CMD_SHARED, 0)) urcu_die(errno); @@ -190,7 +198,7 @@ static void smp_mb_master(void) #ifdef RCU_SIGNAL static void force_mb_all_readers(void) { - struct rcu_reader *index; + struct urcu_reader *index; /* * Ask for each threads to execute a cmm_smp_mb() so we can consider the @@ -283,7 +291,7 @@ static void wait_for_readers(struct cds_list_head *input_readers, struct cds_list_head *qsreaders) { unsigned int wait_loops = 0; - struct rcu_reader *index, *tmp; + struct urcu_reader *index, *tmp; #ifdef HAS_INCOHERENT_CACHES unsigned int wait_gp_loops = 0; #endif /* HAS_INCOHERENT_CACHES */ @@ -303,18 +311,18 @@ static void wait_for_readers(struct cds_list_head *input_readers, } cds_list_for_each_entry_safe(index, tmp, input_readers, node) { - switch (rcu_reader_state(&index->ctr)) { - case RCU_READER_ACTIVE_CURRENT: + switch (urcu_common_reader_state(&rcu_gp, &index->ctr)) { + case URCU_READER_ACTIVE_CURRENT: if (cur_snap_readers) { cds_list_move(&index->node, cur_snap_readers); break; } /* Fall-through */ - case RCU_READER_INACTIVE: + case URCU_READER_INACTIVE: cds_list_move(&index->node, qsreaders); break; - case RCU_READER_ACTIVE_OLD: + case URCU_READER_ACTIVE_OLD: /* * Old snapshot. Leaving node in * input_readers will make us busy-loop @@ -433,7 +441,7 @@ void synchronize_rcu(void) /* * Wait for readers to observe original parity or be quiescent. * wait_for_readers() can release and grab again rcu_registry_lock - * interally. + * internally. */ wait_for_readers(®istry, &cur_snap_readers, &qsreaders); @@ -454,7 +462,7 @@ void synchronize_rcu(void) cmm_smp_mb(); /* Switch parity: 0 -> 1, 1 -> 0 */ - CMM_STORE_SHARED(rcu_gp.ctr, rcu_gp.ctr ^ RCU_GP_CTR_PHASE); + CMM_STORE_SHARED(rcu_gp.ctr, rcu_gp.ctr ^ URCU_GP_CTR_PHASE); /* * Must commit rcu_gp.ctr update to memory before waiting for quiescent @@ -475,7 +483,7 @@ void synchronize_rcu(void) /* * Wait for readers to observe new parity or be quiescent. * wait_for_readers() can release and grab again rcu_registry_lock - * interally. + * internally. */ wait_for_readers(&cur_snap_readers, NULL, &qsreaders); @@ -525,7 +533,7 @@ void rcu_register_thread(void) { URCU_TLS(rcu_reader).tid = pthread_self(); assert(URCU_TLS(rcu_reader).need_mb == 0); - assert(!(URCU_TLS(rcu_reader).ctr & RCU_GP_CTR_NEST_MASK)); + assert(!(URCU_TLS(rcu_reader).ctr & URCU_GP_CTR_NEST_MASK)); mutex_lock(&rcu_registry_lock); assert(!URCU_TLS(rcu_reader).registered); @@ -559,7 +567,7 @@ void rcu_sys_membarrier_status(bool available) { if (!available) return; - rcu_has_sys_membarrier_memb = 1; + urcu_memb_has_sys_membarrier = 1; } #endif @@ -574,7 +582,7 @@ void rcu_sys_membarrier_init(void) if (mask & MEMBARRIER_CMD_PRIVATE_EXPEDITED) { if (membarrier(MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED, 0)) urcu_die(errno); - has_sys_membarrier_private_expedited = 1; + urcu_memb_has_sys_membarrier_private_expedited = 1; available = true; } else if (mask & MEMBARRIER_CMD_SHARED) { available = true; @@ -593,7 +601,9 @@ void rcu_init(void) #endif #ifdef RCU_SIGNAL -static void sigrcu_handler(int signo, siginfo_t *siginfo, void *context) +static void sigrcu_handler(int signo __attribute__((unused)), + siginfo_t *siginfo __attribute__((unused)), + void *context __attribute__((unused))) { /* * Executing this cmm_smp_mb() is the only purpose of this signal handler.