#include <errno.h>
#include <poll.h>
-#include "urcu/wfqueue.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 "urcu-die.h"
+
/* Do not #define _LGPL_SOURCE to ensure we can emit the wrapper symbols */
#undef _LGPL_SOURCE
#include "urcu.h"
#ifdef RCU_MEMBARRIER
static int init_done;
-int has_sys_membarrier;
+int rcu_has_sys_membarrier;
void __attribute__((constructor)) rcu_init(void);
#endif
static pthread_mutex_t rcu_gp_lock = PTHREAD_MUTEX_INITIALIZER;
-int32_t gp_futex;
+int32_t rcu_gp_futex;
/*
* Global grace period counter.
DEFINE_URCU_TLS(struct rcu_reader, rcu_reader);
#ifdef DEBUG_YIELD
-unsigned int yield_active;
-DEFINE_URCU_TLS(unsigned int, rand_yield);
+unsigned int rcu_yield_active;
+DEFINE_URCU_TLS(unsigned int, rcu_rand_yield);
#endif
static CDS_LIST_HEAD(registry);
#ifndef DISTRUST_SIGNALS_EXTREME
ret = pthread_mutex_lock(mutex);
- if (ret) {
- perror("Error in pthread mutex lock");
- exit(-1);
- }
+ if (ret)
+ urcu_die(ret);
#else /* #ifndef DISTRUST_SIGNALS_EXTREME */
while ((ret = pthread_mutex_trylock(mutex)) != 0) {
- if (ret != EBUSY && ret != EINTR) {
- printf("ret = %d, errno = %d\n", ret, errno);
- perror("Error in pthread mutex lock");
- exit(-1);
- }
+ if (ret != EBUSY && ret != EINTR)
+ urcu_die(ret);
if (CMM_LOAD_SHARED(URCU_TLS(rcu_reader).need_mb)) {
cmm_smp_mb();
_CMM_STORE_SHARED(URCU_TLS(rcu_reader).need_mb, 0);
int ret;
ret = pthread_mutex_unlock(mutex);
- if (ret) {
- perror("Error in pthread mutex unlock");
- exit(-1);
- }
+ if (ret)
+ urcu_die(ret);
}
#ifdef RCU_MEMBARRIER
static void smp_mb_master(int group)
{
- if (caa_likely(has_sys_membarrier))
+ if (caa_likely(rcu_has_sys_membarrier))
membarrier(MEMBARRIER_EXPEDITED);
else
cmm_smp_mb();
{
/* Read reader_gp before read futex */
smp_mb_master(RCU_MB_GROUP);
- if (uatomic_read(&gp_futex) == -1)
- futex_async(&gp_futex, FUTEX_WAIT, -1,
+ if (uatomic_read(&rcu_gp_futex) == -1)
+ futex_async(&rcu_gp_futex, FUTEX_WAIT, -1,
NULL, NULL, 0);
}
-void update_counter_and_wait(void)
+static void update_counter_and_wait(void)
{
CDS_LIST_HEAD(qsreaders);
int wait_loops = 0;
for (;;) {
wait_loops++;
if (wait_loops == RCU_QS_ACTIVE_ATTEMPTS) {
- uatomic_dec(&gp_futex);
+ uatomic_dec(&rcu_gp_futex);
/* Write futex before read reader_gp */
smp_mb_master(RCU_MB_GROUP);
}
if (wait_loops == RCU_QS_ACTIVE_ATTEMPTS) {
/* Read reader_gp before write futex */
smp_mb_master(RCU_MB_GROUP);
- uatomic_set(&gp_futex, 0);
+ uatomic_set(&rcu_gp_futex, 0);
}
break;
} else {
if (wait_loops == RCU_QS_ACTIVE_ATTEMPTS) {
/* Read reader_gp before write futex */
smp_mb_master(RCU_MB_GROUP);
- uatomic_set(&gp_futex, 0);
+ uatomic_set(&rcu_gp_futex, 0);
}
break;
} else {
return;
init_done = 1;
if (!membarrier(MEMBARRIER_EXPEDITED | MEMBARRIER_QUERY))
- has_sys_membarrier = 1;
+ rcu_has_sys_membarrier = 1;
}
#endif
act.sa_flags = SA_SIGINFO | SA_RESTART;
sigemptyset(&act.sa_mask);
ret = sigaction(SIGRCU, &act, NULL);
- if (ret) {
- perror("Error in sigaction");
- exit(-1);
- }
+ if (ret)
+ urcu_die(errno);
}
void rcu_exit(void)
int ret;
ret = sigaction(SIGRCU, NULL, &act);
- if (ret) {
- perror("Error in sigaction");
- exit(-1);
- }
+ if (ret)
+ urcu_die(errno);
assert(act.sa_sigaction == sigrcu_handler);
assert(cds_list_empty(®istry));
}