4 * @brief This doubly linked cyclic list is adopted from Linux kernel <linux/list.h>
8 * @copyright Copyright (c) 2022
11 #ifndef __LUNAIX_LLIST_H
12 #define __LUNAIX_LLIST_H
14 #include <lunaix/common.h>
18 struct llist_header* prev;
19 struct llist_header* next;
23 __llist_add(struct llist_header* elem,
24 struct llist_header* prev,
25 struct llist_header* next)
34 llist_init_head(struct llist_header* head) {
40 llist_append(struct llist_header* head, struct llist_header* elem)
42 __llist_add(elem, head, head->next);
46 llist_prepend(struct llist_header* head, struct llist_header* elem)
48 __llist_add(elem, head->prev, head);
52 llist_delete(struct llist_header* elem) {
53 elem->prev->next = elem->next;
54 elem->next->prev = elem->next;
61 static inline int llist_empty(struct llist_header* elem) {
62 return elem->next == elem;
66 * list_entry - get the struct for this entry
67 * @ptr: the &struct list_head pointer.
68 * @type: the type of the struct this is embedded in.
69 * @member: the name of the list_struct within the struct.
71 #define list_entry(ptr, type, member) \
72 container_of(ptr, type, member)
75 * list_for_each_entry - iterate over list of given type
76 * @pos: the type * to use as a loop counter.
77 * @head: the head for your list.
78 * @member: the name of the list_struct within the struct.
80 #define llist_for_each(pos, n, head, member) \
81 for (pos = list_entry((head)->next, typeof(*pos), member), \
82 n = list_entry(pos->member.next, typeof(*pos), member); \
83 &pos->member != (head); \
84 pos = n, n = list_entry(n->member.next, typeof(*n), member))
86 #endif /* __LUNAIX_LLIST_H */