urcu qsbr: add DEBUG_RCU self check
[urcu.git] / urcu-qsbr.h
index 59621807abf470012bc94ee48cc7e6ee786d2b65..448074d019b28ea1219660c43f990b39e09b7479 100644 (file)
@@ -31,6 +31,7 @@
 
 #include <stdlib.h>
 #include <pthread.h>
+#include <assert.h>
 
 #include <compiler.h>
 #include <arch.h>
 
 /*
  * 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 <sched.h>
 #include <time.h>
@@ -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();
 }
 
This page took 0.023336 seconds and 4 git commands to generate.