X-Git-Url: https://git.liburcu.org/?p=urcu.git;a=blobdiff_plain;f=urcu-qsbr-static.h;h=8d8aa3f8f60519620dbcfb78aef1b007c6183e5c;hp=86ae7d4aca91a6dd0ac998e5bf425b054a152716;hb=ab179a1705ee5d662c6a7964645077980096e134;hpb=1a80f35636b70a4f40e0568fbef31b3764035f6f diff --git a/urcu-qsbr-static.h b/urcu-qsbr-static.h index 86ae7d4..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 = 0; + 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(); }