X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=urcu-qsbr.h;h=448074d019b28ea1219660c43f990b39e09b7479;hb=fb6e510b9ae45b9b984b4646b4be6b9d7a2bbf7c;hp=59621807abf470012bc94ee48cc7e6ee786d2b65;hpb=656c6da75f7ee119bfc49e026f52d695d0d1aea2;p=urcu.git diff --git a/urcu-qsbr.h b/urcu-qsbr.h index 5962180..448074d 100644 --- a/urcu-qsbr.h +++ b/urcu-qsbr.h @@ -31,6 +31,7 @@ #include #include +#include #include #include @@ -103,11 +104,17 @@ /* * If a reader is really non-cooperative and refuses to commit its - * urcu_active_readers count to memory (there is no barrier in the reader + * rcu_reader_qs_gp 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 +#ifdef DEBUG_RCU +#define rcu_assert(args...) assert(args) +#else +#define rcu_assert(args...) +#endif + #ifdef DEBUG_YIELD #include #include @@ -161,15 +168,6 @@ static inline void reader_barrier() smp_mb(); } -/* - * The trick here is that RCU_GP_CTR_BIT must be a multiple of 8 so we can use a - * full 8-bits, 16-bits or 32-bits bitmask for the lower order bits. - */ -#define RCU_GP_COUNT (1UL << 0) -/* Use the amount of bits equal to half of the architecture long size */ -#define RCU_GP_CTR_BIT (1UL << (sizeof(long) << 2)) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - /* * Global quiescent period counter with low-order bits unused. * Using a int rather than a char to eliminate false register dependencies @@ -177,9 +175,9 @@ static inline void reader_barrier() */ extern long urcu_gp_ctr; -extern long __thread urcu_active_readers; +extern long __thread rcu_reader_qs_gp; -static inline int rcu_old_gp_ongoing(long *value) +static inline int rcu_gp_ongoing(long *value) { if (value == NULL) return 0; @@ -189,6 +187,7 @@ static inline int rcu_old_gp_ongoing(long *value) static inline void _rcu_read_lock(void) { + rcu_assert(rcu_reader_qs_gp & 1); } static inline void _rcu_read_unlock(void) @@ -198,19 +197,19 @@ static inline void _rcu_read_unlock(void) static inline void _rcu_quiescent_state(void) { smp_mb(); - urcu_active_readers = ACCESS_ONCE(urcu_gp_ctr) + 1; + rcu_reader_qs_gp = ACCESS_ONCE(urcu_gp_ctr) + 1; smp_mb(); } static inline void _rcu_thread_offline(void) { smp_mb(); - urcu_active_readers = ACCESS_ONCE(urcu_gp_ctr); + rcu_reader_qs_gp = ACCESS_ONCE(urcu_gp_ctr); } static inline void _rcu_thread_online(void) { - urcu_active_readers = ACCESS_ONCE(urcu_gp_ctr) + 1; + rcu_reader_qs_gp = ACCESS_ONCE(urcu_gp_ctr) + 1; smp_mb(); }