X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=urcu%2Frculfstack.h;h=a9e624ce792ee2b59ecb648084df5cda73a60e46;hb=ad918eeb98d1ac8b12015050ee60b488e850ac0d;hp=6df6d725a584b0719ebfd6a2c70a9d7a98301789;hpb=1c1e940e005b8483982945b4a2a5f40dfeeb2f8c;p=urcu.git diff --git a/urcu/rculfstack.h b/urcu/rculfstack.h index 6df6d72..a9e624c 100644 --- a/urcu/rculfstack.h +++ b/urcu/rculfstack.h @@ -1,3 +1,6 @@ +#ifndef _URCU_RCULFSTACK_H +#define _URCU_RCULFSTACK_H + /* * rculfstack.h * @@ -43,10 +46,11 @@ void rcu_lfs_init(struct rcu_lfs_stack *s) void rcu_lfs_push(struct rcu_lfs_stack *s, struct rcu_lfs_node *node) { - rcu_read_lock(); for (;;) { - struct rcu_lfs_node *head = rcu_dereference(s->head); + struct rcu_lfs_node *head; + rcu_read_lock(); + head = rcu_dereference(s->head); node->next = head; /* * uatomic_cmpxchg() implicit memory barrier orders earlier @@ -57,6 +61,7 @@ void rcu_lfs_push(struct rcu_lfs_stack *s, struct rcu_lfs_node *node) return; } else { /* Failure to prepend. Retry. */ + rcu_read_unlock(); continue; } } @@ -70,10 +75,11 @@ void rcu_lfs_push(struct rcu_lfs_stack *s, struct rcu_lfs_node *node) struct rcu_lfs_node * rcu_lfs_pop(struct rcu_lfs_stack *s) { - rcu_read_lock(); for (;;) { - struct rcu_lfs_node *head = rcu_dereference(s->head); + struct rcu_lfs_node *head; + rcu_read_lock(); + head = rcu_dereference(s->head); if (head) { struct rcu_lfs_node *next = rcu_dereference(head->next); @@ -82,6 +88,7 @@ rcu_lfs_pop(struct rcu_lfs_stack *s) return head; } else { /* Concurrent modification. Retry. */ + rcu_read_unlock(); continue; } } else { @@ -91,3 +98,5 @@ rcu_lfs_pop(struct rcu_lfs_stack *s) } } } + +#endif /* _URCU_RCULFSTACK_H */