X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=urcu.c;h=bb6629c718086a9800a22a4d3ab21685b27c26a5;hb=935b11ff4cf9053954d21b9d63c4ee367b12a652;hp=5d09a62cfe935072ed0f9471a70c59d0cab4f98e;hpb=b95a001f50047ab146becf9b9e514ab0639f67cd;p=userspace-rcu.git diff --git a/urcu.c b/urcu.c index 5d09a62..bb6629c 100644 --- a/urcu.c +++ b/urcu.c @@ -215,6 +215,10 @@ void update_counter_and_wait(void) */ /* + * Enforce compiler-order of store to rcu_gp_ctr before before + * load rcu_reader ctr. + * This ensures synchronize_rcu() cannot be starved by readers. + * * Adding a smp_mb() which is _not_ formally required, but makes the * model easier to understand. It does not have a big performance impact * anyway, given this is the write-side. @@ -346,7 +350,7 @@ void rcu_register_thread(void) { rcu_reader.tid = pthread_self(); assert(rcu_reader.need_mb == 0); - assert(rcu_reader.ctr == 0); + assert(!(rcu_reader.ctr & RCU_GP_CTR_NEST_MASK)); mutex_lock(&rcu_gp_lock); rcu_init(); /* In case gcc does not support constructor attribute */