X-Git-Url: https://git.liburcu.org/?p=urcu.git;a=blobdiff_plain;f=urcu-qsbr-static.h;h=8d8aa3f8f60519620dbcfb78aef1b007c6183e5c;hp=752d4b9aced8630a94fca3bcf1e6338b012d0e36;hb=ab179a1705ee5d662c6a7964645077980096e134;hpb=7ac06cef7a7d9394332837edc5c0e9595286a5fc diff --git a/urcu-qsbr-static.h b/urcu-qsbr-static.h index 752d4b9..8d8aa3f 100644 --- a/urcu-qsbr-static.h +++ b/urcu-qsbr-static.h @@ -171,10 +171,12 @@ extern long __thread rcu_reader_qs_gp; static inline int rcu_gp_ongoing(long *value) { + long reader_gp; + if (value == NULL) return 0; - - return LOAD_SHARED(*value) & 1; + reader_gp = LOAD_SHARED(*value); + return reader_gp && (reader_gp - urcu_gp_ctr < 0); } static inline void _rcu_read_lock(void) @@ -189,19 +191,19 @@ static inline void _rcu_read_unlock(void) static inline void _rcu_quiescent_state(void) { smp_mb(); - rcu_reader_qs_gp = ACCESS_ONCE(urcu_gp_ctr) + 1; + _STORE_SHARED(rcu_reader_qs_gp, _LOAD_SHARED(urcu_gp_ctr)); smp_mb(); } static inline void _rcu_thread_offline(void) { smp_mb(); - rcu_reader_qs_gp = ACCESS_ONCE(urcu_gp_ctr); + STORE_SHARED(rcu_reader_qs_gp, 0); } static inline void _rcu_thread_online(void) { - rcu_reader_qs_gp = ACCESS_ONCE(urcu_gp_ctr) + 1; + _STORE_SHARED(rcu_reader_qs_gp, LOAD_SHARED(urcu_gp_ctr)); smp_mb(); }