#define BUILD_QSBR_LIB
#include "urcu/static/urcu-qsbr.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
* Written to only by each individual reader. Read by both the reader and the
* writers.
*/
-struct rcu_reader __thread rcu_reader;
+__DEFINE_URCU_TLS_GLOBAL(struct rcu_reader, rcu_reader);
#ifdef DEBUG_YIELD
unsigned int yield_active;
-unsigned int __thread rand_yield;
+__DEFINE_URCU_TLS_GLOBAL(unsigned int, 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);
poll(NULL,0,10);
}
#endif /* #else #ifndef DISTRUST_SIGNALS_EXTREME */
int ret;
ret = pthread_mutex_unlock(mutex);
- if (ret) {
- perror("Error in pthread mutex unlock");
- exit(-1);
- }
+ if (ret)
+ urcu_die(ret);
}
/*
static void update_counter_and_wait(void)
{
CDS_LIST_HEAD(qsreaders);
- int wait_loops = 0;
+ unsigned int wait_loops = 0;
struct rcu_reader *index, *tmp;
#if (CAA_BITS_PER_LONG < 64)
* quiescent state. Failure to do so could result in the writer
* waiting forever while new readers are always accessing data
* (no progress). Enforce compiler-order of store to rcu_gp_ctr
- * before load rcu_reader ctr.
+ * before load URCU_TLS(rcu_reader).ctr.
*/
cmm_barrier();
* Wait for each thread rcu_reader_qs_gp count to become 0.
*/
for (;;) {
- wait_loops++;
+ if (wait_loops < RCU_QS_ACTIVE_ATTEMPTS)
+ wait_loops++;
if (wait_loops >= RCU_QS_ACTIVE_ATTEMPTS) {
uatomic_set(&gp_futex, -1);
/*
{
unsigned long was_online;
- was_online = rcu_reader.ctr;
+ was_online = URCU_TLS(rcu_reader).ctr;
/* All threads should read qparity before accessing data structure
* where new ptr points to. In the "then" case, rcu_thread_offline
* committing next rcu_gp_ctr update to memory. Failure to
* do so could result in the writer waiting forever while new
* readers are always accessing data (no progress). Enforce
- * compiler-order of load rcu_reader ctr before store to
+ * compiler-order of load URCU_TLS(rcu_reader).ctr before store to
* rcu_gp_ctr.
*/
cmm_barrier();
{
unsigned long was_online;
- was_online = rcu_reader.ctr;
+ was_online = URCU_TLS(rcu_reader).ctr;
/*
* Mark the writer thread offline to make sure we don't wait for
void rcu_register_thread(void)
{
- rcu_reader.tid = pthread_self();
- assert(rcu_reader.ctr == 0);
+ URCU_TLS(rcu_reader).tid = pthread_self();
+ assert(URCU_TLS(rcu_reader).ctr == 0);
mutex_lock(&rcu_gp_lock);
- cds_list_add(&rcu_reader.node, ®istry);
+ cds_list_add(&URCU_TLS(rcu_reader).node, ®istry);
mutex_unlock(&rcu_gp_lock);
_rcu_thread_online();
}
*/
_rcu_thread_offline();
mutex_lock(&rcu_gp_lock);
- cds_list_del(&rcu_reader.node);
+ cds_list_del(&URCU_TLS(rcu_reader).node);
mutex_unlock(&rcu_gp_lock);
}
*/
}
-DEFINE_RCU_FLAVOR()
+DEFINE_RCU_FLAVOR(rcu_flavor);
#include "urcu-call-rcu-impl.h"
#include "urcu-defer-impl.h"