X-Git-Url: http://git.liburcu.org/?p=urcu.git;a=blobdiff_plain;f=include%2Furcu%2Fstatic%2Furcu-mb.h;fp=include%2Furcu%2Fstatic%2Furcu-mb.h;h=8ddbd0026cbcc129dd374fdf48a974a2bb4db665;hp=cfa5e9314313b9dc78bfef78325551f4fffff824;hb=601922a81d884e16ff404cee7534ede56fb87d0a;hpb=fcab075f67cf3e29e8556b4af1bbbfb210977ac2 diff --git a/include/urcu/static/urcu-mb.h b/include/urcu/static/urcu-mb.h index cfa5e93..8ddbd00 100644 --- a/include/urcu/static/urcu-mb.h +++ b/include/urcu/static/urcu-mb.h @@ -94,13 +94,14 @@ static inline void _urcu_mb_read_lock(void) */ static inline void _urcu_mb_read_unlock_update_and_wakeup(unsigned long tmp) { + unsigned long *ctr = &URCU_TLS(urcu_mb_reader).ctr; + if (caa_likely((tmp & URCU_GP_CTR_NEST_MASK) == URCU_GP_COUNT)) { - cmm_smp_mb(); - _CMM_STORE_SHARED(URCU_TLS(urcu_mb_reader).ctr, tmp - URCU_GP_COUNT); - cmm_smp_mb(); + uatomic_store(ctr, tmp - URCU_GP_COUNT, CMM_SEQ_CST); urcu_common_wake_up_gp(&urcu_mb_gp); - } else - _CMM_STORE_SHARED(URCU_TLS(urcu_mb_reader).ctr, tmp - URCU_GP_COUNT); + } else { + uatomic_store(ctr, tmp - URCU_GP_COUNT, CMM_RELAXED); + } } /*