{
LIST_HEAD(qsreaders);
int wait_loops = 0;
- struct urcu_reader *index;
+ struct urcu_reader *index, *tmp;
if (list_empty(®istry))
return;
force_mb_all_threads();
}
- list_for_each_entry(index, ®istry, head) {
+ list_for_each_entry_safe(index, tmp, ®istry, head) {
if (!rcu_old_gp_ongoing(&index->ctr))
list_move(&index->head, &qsreaders);
}
#endif /* #else #ifndef HAS_INCOHERENT_CACHES */
}
/* put back the reader list in the registry */
- list_move(&qsreaders, ®istry);
+ list_splice(&qsreaders, ®istry);
}
void synchronize_rcu(void)
_rcu_read_unlock();
}
-void *rcu_dereference(void *p)
-{
- return _rcu_dereference(p);
-}
-
-void *rcu_assign_pointer_sym(void **p, void *v)
-{
- wmb();
- return STORE_SHARED(p, v);
-}
-
-void *rcu_xchg_pointer_sym(void **p, void *v)
-{
- wmb();
- return uatomic_xchg(p, v);
-}
-
-void *rcu_cmpxchg_pointer_sym(void **p, void *old, void *_new)
-{
- wmb();
- return uatomic_cmpxchg(p, old, _new);
-}
-
-void *rcu_publish_content_sym(void **p, void *v)
-{
- void *oldptr;
-
- oldptr = _rcu_xchg_pointer(p, v);
- synchronize_rcu();
- return oldptr;
-}
-
void rcu_register_thread(void)
{
urcu_reader.tid = pthread_self();