X-Git-Url: http://git.liburcu.org/?p=urcu.git;a=blobdiff_plain;f=urcu%2Fstatic%2Furcu-bp.h;fp=urcu%2Fstatic%2Furcu-bp.h;h=ffd4b8959b61e49c092fa7d72a3053d5223ab500;hp=0fcaa3aa272806aa9c8786c96b7675de4fcfddd3;hb=343c8b13592134185263cd6e30a615c8c4e35b6d;hpb=a77f7d8228bcf1259f8c4121ce02d4763424d45a diff --git a/urcu/static/urcu-bp.h b/urcu/static/urcu-bp.h index 0fcaa3a..ffd4b89 100644 --- a/urcu/static/urcu-bp.h +++ b/urcu/static/urcu-bp.h @@ -164,11 +164,13 @@ static inline void _rcu_read_lock(void) */ 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 */ }