RCU list: add rcuhlist.h, add list_replace_rcu
[urcu.git] / urcu / rculist.h
index e0ff93923fa3ffd2b5675fc273f4ebd6ddf3b3e6..b0c4f1a9d1e4430b538d737bc69246b2e789ce65 100644 (file)
@@ -4,6 +4,7 @@
 
    Copyright (C) 2009 Pierre-Marc Fournier
    Conversion to RCU list.
+   Copyright (C) 2010 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
 
    The GNU C Library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
@@ -38,6 +39,15 @@ static inline void list_add_rcu(list_t *newp, list_t *head)
        head->next = newp;
 }
 
+/* replace an old entry atomically.
+ */
+static inline void list_replace_rcu(list_t *old, list_t *_new)
+{
+       _new->next = old->next;
+       _new->prev = old->prev;
+       rcu_assign_pointer(_new->prev->next, _new);
+       _new->next->prev = _new;
+}
 
 /* Remove element from list. */
 static inline void list_del_rcu(list_t *elem)
@@ -46,11 +56,19 @@ static inline void list_del_rcu(list_t *elem)
        elem->prev->next = elem->next;
 }
 
+/*
+ * Iteration through all elements of the list must be done while rcu_read_lock()
+ * is held.
+ */
+
+/* Iterate forward over the elements of the list.  */
+#define list_for_each_rcu(pos, head) \
+  for (pos = rcu_dereference((head)->next); pos != (head); \
+       pos = rcu_dereference(pos->next))
+
 
 /* Iterate through elements of the list.
- * This must be done while rcu_read_lock() is held.
  */
-
 #define list_for_each_entry_rcu(pos, head, member)                             \
        for (pos = list_entry(rcu_dereference((head)->next), typeof(*pos), member);     \
             &pos->member != (head);                                    \
This page took 0.023229 seconds and 4 git commands to generate.