properly update the pprev of next node when deleting hlist_node (close #30)
[lunaix-os.git] / lunaix-os / includes / lunaix / ds / llist.h
index 9af9dd1fba4ebe90fe86090e3e72438492cea95e..88e25233e718eddc335ced9c326b3c9cfa742dbd 100644 (file)
@@ -12,7 +12,7 @@
 #ifndef __LUNAIX_LLIST_H
 #define __LUNAIX_LLIST_H
 
 #ifndef __LUNAIX_LLIST_H
 #define __LUNAIX_LLIST_H
 
-#include <lunaix/common.h>
+#include <lunaix/types.h>
 
 struct llist_header
 {
 
 struct llist_header
 {
@@ -41,13 +41,19 @@ llist_init_head(struct llist_header* head)
 static inline void
 llist_append(struct llist_header* head, struct llist_header* elem)
 {
 static inline void
 llist_append(struct llist_header* head, struct llist_header* elem)
 {
-    __llist_add(elem, head, head->next);
+    __llist_add(elem, head->prev, head);
 }
 
 static inline void
 llist_prepend(struct llist_header* head, struct llist_header* elem)
 {
 }
 
 static inline void
 llist_prepend(struct llist_header* head, struct llist_header* elem)
 {
-    __llist_add(elem, head->prev, head);
+    __llist_add(elem, head, head->next);
+}
+
+static inline void
+llist_insert_after(struct llist_header* head, struct llist_header* elem)
+{
+    __llist_add(elem, head, head->next);
 }
 
 static inline void
 }
 
 static inline void
@@ -67,6 +73,12 @@ llist_empty(struct llist_header* elem)
     return elem->next == elem && elem->prev == elem;
 }
 
     return elem->next == elem && elem->prev == elem;
 }
 
+#define DEFINE_LLIST(name)                                                     \
+    struct llist_header name = (struct llist_header)                           \
+    {                                                                          \
+        .prev = &name, .next = &name                                           \
+    }
+
 /**
  * list_entry - get the struct for this entry
  * @ptr:       the &struct list_head pointer.
 /**
  * list_entry - get the struct for this entry
  * @ptr:       the &struct list_head pointer.
@@ -75,6 +87,22 @@ llist_empty(struct llist_header* elem)
  */
 #define list_entry(ptr, type, member) container_of(ptr, type, member)
 
  */
 #define list_entry(ptr, type, member) container_of(ptr, type, member)
 
+/**
+ * list_next - get the struct for next entry
+ * @ptr:       the &struct list_head pointer.
+ * @type:      the type of the struct this is embedded in.
+ * @member:    the name of the list_struct within the struct.
+ */
+#define list_next(current, type, member) container_of(current->member.next, type, member)
+
+/**
+ * list_prev - get the struct for prev entry
+ * @ptr:       the &struct list_head pointer.
+ * @type:      the type of the struct this is embedded in.
+ * @member:    the name of the list_struct within the struct.
+ */
+#define list_prev(current, type, member) container_of(current->member.prev, type, member)
+
 /**
  * list_for_each_entry -       iterate over list of given type
  * @pos:       the type * to use as a loop counter.
 /**
  * list_for_each_entry -       iterate over list of given type
  * @pos:       the type * to use as a loop counter.
@@ -93,9 +121,17 @@ struct hlist_node
 };
 
 static inline void
 };
 
 static inline void
-hlist_del(struct hlist_node* node)
+hlist_delete(struct hlist_node* node)
 {
 {
+    if (!node->pprev)
+        return;
+
+    if (node->next) {
+        node->next->pprev = node->pprev;
+    }
+    
     *node->pprev = node->next;
     *node->pprev = node->next;
+
     node->next = 0;
     node->pprev = 0;
 }
     node->next = 0;
     node->pprev = 0;
 }