X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=urcu%2Frculfstack-static.h;h=3ce24c55d2ddcf385f9e90006a016b305b557766;hb=4fc06b7fbadc933271cf1b75e03a923486f7247b;hp=8eae35d1bc0d2c9fc12955d6c5185f3bcb1ecfbb;hpb=b6a37eaca5f072e7bba90a2562b7f2ac238fe23b;p=urcu.git diff --git a/urcu/rculfstack-static.h b/urcu/rculfstack-static.h index 8eae35d..3ce24c5 100644 --- a/urcu/rculfstack-static.h +++ b/urcu/rculfstack-static.h @@ -44,24 +44,19 @@ void _rcu_lfs_init(struct rcu_lfs_stack *s) void _rcu_lfs_push(struct rcu_lfs_stack *s, struct rcu_lfs_node *node) { + struct rcu_lfs_node *head = NULL; + for (;;) { - struct rcu_lfs_node *head; + struct rcu_lfs_node *old_head = head; - rcu_read_lock(); - head = rcu_dereference(s->head); node->next = head; /* * uatomic_cmpxchg() implicit memory barrier orders earlier * stores to node before publication. */ - if (uatomic_cmpxchg(&s->head, head, node) == head) { - rcu_read_unlock(); - return; - } else { - /* Failure to prepend. Retry. */ - rcu_read_unlock(); - continue; - } + head = uatomic_cmpxchg(&s->head, old_head, node); + if (old_head == head) + break; } }