#include <urcu/uatomic.h>
#include <urcu/list.h>
#include <urcu/tls-compat.h>
+#include <urcu/debug.h>
/*
* This code section can only be included in LGPL 2.1 compatible source code.
extern "C" {
#endif
-#ifdef DEBUG_RCU
-#define rcu_assert(args...) assert(args)
-#else
-#define rcu_assert(args...)
-#endif
-
enum rcu_state {
RCU_READER_ACTIVE_CURRENT,
RCU_READER_ACTIVE_OLD,
rcu_bp_register(); /* If not yet registered. */
cmm_barrier(); /* Ensure the compiler does not reorder us with mutex */
tmp = URCU_TLS(rcu_reader)->ctr;
+ urcu_assert((tmp & RCU_GP_CTR_NEST_MASK) != RCU_GP_CTR_NEST_MASK);
_rcu_read_lock_update(tmp);
}
*/
static inline void _rcu_read_unlock(void)
{
- /*
- * Finish using rcu before decrementing the pointer.
- */
+ unsigned long tmp;
+
+ tmp = URCU_TLS(rcu_reader)->ctr;
+ urcu_assert(tmp & RCU_GP_CTR_NEST_MASK);
+ /* Finish using rcu before decrementing the pointer. */
cmm_smp_mb();
- _CMM_STORE_SHARED(URCU_TLS(rcu_reader)->ctr, URCU_TLS(rcu_reader)->ctr - RCU_GP_COUNT);
+ _CMM_STORE_SHARED(URCU_TLS(rcu_reader)->ctr, tmp - RCU_GP_COUNT);
cmm_barrier(); /* Ensure the compiler does not reorder us with mutex */
}