X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=urcu-qsbr.c;h=1dc99792d7a49f2f6f3614693e34cde239312bfb;hb=a128aeb4a7b1a05c9ddbc8b0239c93ca00984f4a;hp=5e4348449ca9183b61bf1cbc6a041a549f784c2b;hpb=71c811bf8db75c9502b295edb1e190f978682b65;p=urcu.git diff --git a/urcu-qsbr.c b/urcu-qsbr.c index 5e43484..1dc9979 100644 --- a/urcu-qsbr.c +++ b/urcu-qsbr.c @@ -218,8 +218,11 @@ void synchronize_rcu(void) * our own quiescent state. This allows using synchronize_rcu() * in threads registered as readers. */ - if (was_online) + if (was_online) { CMM_STORE_SHARED(rcu_reader.ctr, 0); + cmm_smp_mb(); /* write rcu_reader.ctr before read futex */ + wake_up_gp(); + } mutex_lock(&rcu_gp_lock); @@ -277,8 +280,11 @@ void synchronize_rcu(void) * in threads registered as readers. */ cmm_smp_mb(); - if (was_online) + if (was_online) { CMM_STORE_SHARED(rcu_reader.ctr, 0); + cmm_smp_mb(); /* write rcu_reader.ctr before read futex */ + wake_up_gp(); + } mutex_lock(&rcu_gp_lock); if (cds_list_empty(®istry))