Fix force_mb_all_threads must be called within internal local
authorMathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
Thu, 12 Feb 2009 06:43:54 +0000 (01:43 -0500)
committerMathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
Thu, 12 Feb 2009 06:43:54 +0000 (01:43 -0500)
It iterates on threads, and must therefore be called within the mutex.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
urcu.c

diff --git a/urcu.c b/urcu.c
index 0e42207e2bcd59d82127dc308def83b85c424798..f2aae3433eeb310c16b6ed82a45aacafea76135a 100644 (file)
--- a/urcu.c
+++ b/urcu.c
@@ -152,13 +152,14 @@ void wait_for_quiescent_state(void)
 
 void synchronize_rcu(void)
 {
+       internal_urcu_lock();
+
        /* All threads should read qparity before accessing data structure
-        * where new ptr points to. */
+        * where new ptr points to. Must be done within internal_urcu_lock
+        * because it iterates on reader threads.*/
        /* Write new ptr before changing the qparity */
        force_mb_all_threads();
 
-       internal_urcu_lock();
-
        switch_next_urcu_qparity();     /* 0 -> 1 */
 
        /*
@@ -197,13 +198,12 @@ void synchronize_rcu(void)
         */
        wait_for_quiescent_state();     /* Wait readers in parity 1 */
 
-       internal_urcu_unlock();
-
-       /* All threads should finish using the data referred to by old ptr
-        * before decrementing their urcu_active_readers count */
        /* Finish waiting for reader threads before letting the old ptr being
-        * freed. */
+        * freed. Must be done within internal_urcu_lock because it iterates on
+        * reader threads. */
        force_mb_all_threads();
+
+       internal_urcu_unlock();
 }
 
 void urcu_add_reader(pthread_t id)
This page took 0.028547 seconds and 4 git commands to generate.