projects
/
urcu.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix force_mb_all_threads must be called within internal local
[urcu.git]
/
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)
{
void synchronize_rcu(void)
{
+ internal_urcu_lock();
+
/* All threads should read qparity before accessing data structure
/* 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();
/* Write new ptr before changing the qparity */
force_mb_all_threads();
- internal_urcu_lock();
-
switch_next_urcu_qparity(); /* 0 -> 1 */
/*
switch_next_urcu_qparity(); /* 0 -> 1 */
/*
@@
-197,13
+198,12
@@
void synchronize_rcu(void)
*/
wait_for_quiescent_state(); /* Wait readers in parity 1 */
*/
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
/* 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();
force_mb_all_threads();
+
+ internal_urcu_unlock();
}
void urcu_add_reader(pthread_t id)
}
void urcu_add_reader(pthread_t id)
This page took
0.023013 seconds
and
4
git commands to generate.