Fix rcu_assign_pointer() dynamic linking behavior
[urcu.git] / urcu.c
diff --git a/urcu.c b/urcu.c
index e70980f5b93e259f5506e3fb7e1b602708aa63b3..c13ad634e7cb7b98f24d8c9a5a756eb26487bf7b 100644 (file)
--- a/urcu.c
+++ b/urcu.c
@@ -216,7 +216,7 @@ void wait_for_quiescent_state(void)
 {
        LIST_HEAD(qsreaders);
        int wait_loops = 0;
-       struct urcu_reader *index;
+       struct urcu_reader *index, *tmp;
 
        if (list_empty(&registry))
                return;
@@ -231,7 +231,7 @@ void wait_for_quiescent_state(void)
                        force_mb_all_threads();
                }
 
-               list_for_each_entry(index, &registry, head) {
+               list_for_each_entry_safe(index, tmp, &registry, head) {
                        if (!rcu_old_gp_ongoing(&index->ctr))
                                list_move(&index->head, &qsreaders);
                }
@@ -278,7 +278,7 @@ void wait_for_quiescent_state(void)
 #endif /* #else #ifndef HAS_INCOHERENT_CACHES */
        }
        /* put back the reader list in the registry */
-       list_move(&qsreaders, &registry);
+       list_splice(&qsreaders, &registry);
 }
 
 void synchronize_rcu(void)
@@ -380,7 +380,7 @@ void *rcu_dereference(void *p)
 void *rcu_assign_pointer_sym(void **p, void *v)
 {
        wmb();
-       return STORE_SHARED(p, v);
+       return STORE_SHARED(*p, v);
 }
 
 void *rcu_xchg_pointer_sym(void **p, void *v)
This page took 0.022827 seconds and 4 git commands to generate.