Add new list implementation 49/151049/12
authorMichal Bloch <m.bloch@samsung.com>
Tue, 19 Sep 2017 12:23:09 +0000 (14:23 +0200)
committerKrzysztof Opasiak <k.opasiak@samsung.com>
Fri, 17 Nov 2017 11:43:41 +0000 (12:43 +0100)
Change-Id: Idb53946d8965faf0f40b270e9c6bf0062c783e82
Signed-off-by: Michal Bloch <m.bloch@samsung.com>
[Reword commit message]
Signed-off-by: Krzysztof Opasiak <k.opasiak@samsung.com>
src/util/list.h

index 07e1365d82a3099a00fcd4582af895e97f8f61cb..957de54e4121402bce2550ef91dc67cfd960b6f2 100644 (file)
@@ -39,6 +39,18 @@ struct list_head {
 
 static inline void INIT_LIST_HEAD(struct list_head *head)
 {
+       head->next = head;
+       head->prev = head;
+}
+
+static inline void list_add_helper(struct list_head *new,
+                                   struct list_head *prev,
+                                   struct list_head *next)
+{
+       new->prev = prev;
+       new->next = next;
+       next->prev = new;
+       prev->next = new;
 }
 
 /*
@@ -46,6 +58,7 @@ static inline void INIT_LIST_HEAD(struct list_head *head)
  */
 static inline void list_add(struct list_head *new, struct list_head *head)
 {
+       list_add_helper(new, head, head->next);
 }
 
 /*
@@ -53,24 +66,7 @@ static inline void list_add(struct list_head *new, struct list_head *head)
  */
 static inline void list_add_tail(struct list_head *new, struct list_head *head)
 {
-}
-
-/*
- * Delete all entries between prev and next
- *
- * Should be used only internally
- */
-static inline void __list_del(struct list_head *prev, struct list_head *next)
-{
-}
-
-/*
- * Remove given element from the list
- *
- * Should be used only internally
- */
-static inline void __list_del_entry(struct list_head *entry)
-{
+       list_add_helper(new, head->prev, head);
 }
 
 /*
@@ -78,6 +74,13 @@ static inline void __list_del_entry(struct list_head *entry)
  */
 static inline void list_del(struct list_head *entry)
 {
+       entry->next->prev = entry->prev;
+       entry->prev->next = entry->next;
+
+#ifdef FAULTD_DEBUG_LIST
+       entry->prev = LIST_POISON1;
+       entry->next = LIST_POISON2;
+#endif
 }
 
 /*
@@ -85,35 +88,58 @@ static inline void list_del(struct list_head *entry)
  */
 static inline void list_del_init(struct list_head *entry)
 {
+       list_del(entry);
+       INIT_LIST_HEAD(entry);
 }
 
 static inline int list_empty(const struct list_head *head)
 {
+       return head->next == head;
 }
 
 static inline int list_is_singular(const struct list_head *head)
 {
+       return (!list_empty(head) && head->prev == head->next);
 }
 
-#define list_entry(ptr, type, member)
-
+#define list_entry(ptr, type, member) \
+       container_of((ptr), type, member)
 
-#define list_first_entry(ptr, type, member)
+#define list_first_entry(ptr, type, member) \
+       list_entry((ptr)->next, type, member)
 
-#define list_first_entry_or_null(ptr, type, member)
+#define list_first_entry_or_null(ptr, type, member) \
+       (list_empty(ptr) ? NULL : list_first_entry((ptr), type, member))
 
-#define list_last_entry(ptr, type, member)
+#define list_last_entry(ptr, type, member) \
+       list_entry((ptr)->prev, type, member)
 
-#define list_next_entry(pos, member)
+#define list_next_entry(pos, member) \
+       list_entry((pos)->member.next, typeof(*pos), member)
 
-#define list_prev_entry(pos, member)
+#define list_prev_entry(pos, member) \
+       list_entry((pos)->member.prev, typeof(*pos), member)
 
-#define list_for_each(pos, head)
+#define list_for_each(pos, head) for ( \
+       (pos) = (head)->next; \
+       (pos) != (head); \
+       (pos) = (pos)->next)
 
-#define list_for_each_safe(pos, n, head)
+#define list_for_each_safe(pos, n, head) for ( \
+       (pos) = (head)->next, (n) = (pos)->next; \
+       (pos) != (head); \
+       (pos) = (n), (n) = (pos)->next)
 
-#define list_for_each_entry(pos, head, member)
+#define list_for_each_entry(pos, head, member) for ( \
+       (pos) = list_first_entry((head), typeof(*pos), member); \
+       &(pos)->member != (head); \
+       (pos) = list_next_entry((pos), member))
 
-#define list_for_each_entry_safe(pos, n, head, member)
+#define list_for_each_entry_safe(pos, n, head, member) for ( \
+       (pos) = list_first_entry((head), typeof(*pos), member), \
+               (n) = list_next_entry((pos), member); \
+       &(pos)->member != (head); \
+       (pos) = (n), \
+               (n) = list_next_entry((pos), member))
 
 #endif /* _FAULTD_LIST_H */