ifdef C, wait-free stack adaptative pop wait
[urcu.git] / urcu / rculfstack.h
index 6df6d725a584b0719ebfd6a2c70a9d7a98301789..f80c7fea012a6e6240bf2ee04ee54f557966a4ff 100644 (file)
@@ -1,3 +1,6 @@
+#ifndef _URCU_RCULFSTACK_H
+#define _URCU_RCULFSTACK_H
+
 /*
  * rculfstack.h
  *
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 #if (!defined(_GNU_SOURCE) && !defined(_LGPL_SOURCE))
 #error "Dynamic loader LGPL wrappers not implemented yet"
 #endif
@@ -43,10 +50,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 +65,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 +79,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 +92,7 @@ rcu_lfs_pop(struct rcu_lfs_stack *s)
                                return head;
                        } else {
                                /* Concurrent modification. Retry. */
+                               rcu_read_unlock();
                                continue;
                        }
                } else {
@@ -91,3 +102,9 @@ rcu_lfs_pop(struct rcu_lfs_stack *s)
                }
        }
 }
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _URCU_RCULFSTACK_H */
This page took 0.023587 seconds and 4 git commands to generate.