projects
/
urcu.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
RCU wait-free stack: add _blocking in pop() primitive name
[urcu.git]
/
urcu
/
rculfstack.h
diff --git
a/urcu/rculfstack.h
b/urcu/rculfstack.h
index 6df6d725a584b0719ebfd6a2c70a9d7a98301789..a9e624ce792ee2b59ecb648084df5cda73a60e46 100644
(file)
--- a/
urcu/rculfstack.h
+++ b/
urcu/rculfstack.h
@@
-1,3
+1,6
@@
+#ifndef _URCU_RCULFSTACK_H
+#define _URCU_RCULFSTACK_H
+
/*
* 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)
{
void rcu_lfs_push(struct rcu_lfs_stack *s, struct rcu_lfs_node *node)
{
- rcu_read_lock();
for (;;) {
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
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. */
return;
} else {
/* Failure to prepend. Retry. */
+ rcu_read_unlock();
continue;
}
}
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)
{
struct rcu_lfs_node *
rcu_lfs_pop(struct rcu_lfs_stack *s)
{
- rcu_read_lock();
for (;;) {
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);
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. */
return head;
} else {
/* Concurrent modification. Retry. */
+ rcu_read_unlock();
continue;
}
} else {
continue;
}
} else {
@@
-91,3
+98,5
@@
rcu_lfs_pop(struct rcu_lfs_stack *s)
}
}
}
}
}
}
+
+#endif /* _URCU_RCULFSTACK_H */
This page took
0.024473 seconds
and
4
git commands to generate.