#include <syscall.h>
#include <unistd.h>
-#include <compiler.h>
-#include <arch.h>
+#include <urcu/compiler.h>
+#include <urcu/arch.h>
+#include <urcu/list.h>
/*
* Identify a shared load. A smp_rmc() or smp_mc() should come before the load.
/*
* If a reader is really non-cooperative and refuses to commit its
- * rcu_reader_qs_gp count to memory (there is no barrier in the reader
+ * urcu_reader.ctr count to memory (there is no barrier in the reader
* per-se), kick it after a few loops waiting for it.
*/
#define KICK_READER_LOOPS 10000
*/
extern unsigned long urcu_gp_ctr;
-extern unsigned long __thread rcu_reader_qs_gp;
+struct urcu_reader {
+ unsigned long ctr;
+ struct list_head head;
+ pthread_t tid;
+};
+
+extern struct urcu_reader __thread urcu_reader;
extern int gp_futex;
*/
static inline void wake_up_gp(void)
{
- if (unlikely(atomic_read(&gp_futex) == -1)) {
- atomic_set(&gp_futex, 0);
+ if (unlikely(uatomic_read(&gp_futex) == -1)) {
+ uatomic_set(&gp_futex, 0);
futex(&gp_futex, FUTEX_WAKE, 1,
NULL, NULL, 0);
}
static inline void _rcu_read_lock(void)
{
- rcu_assert(rcu_reader_qs_gp);
+ rcu_assert(urcu_reader.ctr);
}
static inline void _rcu_read_unlock(void)
static inline void _rcu_quiescent_state(void)
{
smp_mb();
- _STORE_SHARED(rcu_reader_qs_gp, _LOAD_SHARED(urcu_gp_ctr));
- smp_mb(); /* write rcu_reader_qs_gp before read futex */
+ _STORE_SHARED(urcu_reader.ctr, _LOAD_SHARED(urcu_gp_ctr));
+ smp_mb(); /* write urcu_reader.ctr before read futex */
wake_up_gp();
smp_mb();
}
static inline void _rcu_thread_offline(void)
{
smp_mb();
- STORE_SHARED(rcu_reader_qs_gp, 0);
- smp_mb(); /* write rcu_reader_qs_gp before read futex */
+ STORE_SHARED(urcu_reader.ctr, 0);
+ smp_mb(); /* write urcu_reader.ctr before read futex */
wake_up_gp();
}
static inline void _rcu_thread_online(void)
{
- _STORE_SHARED(rcu_reader_qs_gp, LOAD_SHARED(urcu_gp_ctr));
+ _STORE_SHARED(urcu_reader.ctr, LOAD_SHARED(urcu_gp_ctr));
smp_mb();
}
if (!__builtin_constant_p(_new) || \
((_new) != NULL)) \
wmb(); \
- cmpxchg(p, old, _new); \
+ uatomic_cmpxchg(p, old, _new); \
})
/**
if (!__builtin_constant_p(v) || \
((v) != NULL)) \
wmb(); \
- xchg(p, v); \
+ uatomic_xchg(p, v); \
})
/*