urcu: Add extra "engineering safety factor" memory barrier in update_counter_and_wait()
[urcu.git] / urcu.c
diff --git a/urcu.c b/urcu.c
index 5d09a62cfe935072ed0f9471a70c59d0cab4f98e..bb6629c718086a9800a22a4d3ab21685b27c26a5 100644 (file)
--- 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 */
This page took 0.022947 seconds and 4 git commands to generate.