X-Git-Url: http://git.liburcu.org/?p=urcu.git;a=blobdiff_plain;f=include%2Furcu%2Fstatic%2Furcu-signal.h;fp=include%2Furcu%2Fstatic%2Furcu-signal.h;h=0f78ac0d1e1378d8a2898ce27ae424212747d9ce;hp=baee2298c9232e34b16e5ca6a0e0923fb0fd7daf;hb=97d13221f8a10e9ba38821dea2c2ff299d166c71;hpb=7e60fda72a3501c52b69bb042c0947817cbe1acc diff --git a/include/urcu/static/urcu-signal.h b/include/urcu/static/urcu-signal.h index baee229..0f78ac0 100644 --- a/include/urcu/static/urcu-signal.h +++ b/include/urcu/static/urcu-signal.h @@ -95,13 +95,14 @@ static inline void _urcu_signal_read_lock(void) */ static inline void _urcu_signal_read_unlock_update_and_wakeup(unsigned long tmp) { + unsigned long *ctr = &URCU_TLS(urcu_signal_reader).ctr; + if (caa_likely((tmp & URCU_GP_CTR_NEST_MASK) == URCU_GP_COUNT)) { - cmm_barrier(); - _CMM_STORE_SHARED(URCU_TLS(urcu_signal_reader).ctr, tmp - URCU_GP_COUNT); - cmm_barrier(); + uatomic_store(ctr, tmp - URCU_GP_COUNT, CMM_SEQ_CST); urcu_common_wake_up_gp(&urcu_signal_gp); - } else - _CMM_STORE_SHARED(URCU_TLS(urcu_signal_reader).ctr, tmp - URCU_GP_COUNT); + } else { + uatomic_store(ctr, tmp - URCU_GP_COUNT, CMM_RELAXED); + } } /*