From: Michal Bloch Date: Tue, 19 Sep 2017 12:23:09 +0000 (+0200) Subject: Add new list implementation X-Git-Tag: submit/tizen/20180222.151354~30 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e1ded073cfa5378a8a459f54ee9f28dc9fafbcb5;p=platform%2Fcore%2Fsystem%2Ffaultd.git Add new list implementation Change-Id: Idb53946d8965faf0f40b270e9c6bf0062c783e82 Signed-off-by: Michal Bloch [Reword commit message] Signed-off-by: Krzysztof Opasiak --- diff --git a/src/util/list.h b/src/util/list.h index 07e1365..957de54 100644 --- a/src/util/list.h +++ b/src/util/list.h @@ -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 */