X-Git-Url: http://git.liburcu.org/?p=urcu.git;a=blobdiff_plain;f=urcu.c;h=f2aae3433eeb310c16b6ed82a45aacafea76135a;hp=0e42207e2bcd59d82127dc308def83b85c424798;hb=135530fd6a47925c76a3e828f2fc7d6751bc9ff7;hpb=40e140c9f237bbe8c50d4a5355561139f01afb70 diff --git a/urcu.c b/urcu.c index 0e42207..f2aae34 100644 --- 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)