4 * @brief This doubly linked cyclic list is adopted from Linux kernel
9 * @copyright Copyright (c) 2022
12 #ifndef __LUNAIX_LLIST_H
13 #define __LUNAIX_LLIST_H
15 #include <lunaix/types.h>
19 struct llist_header* prev;
20 struct llist_header* next;
24 __llist_add(struct llist_header* elem,
25 struct llist_header* prev,
26 struct llist_header* next)
35 llist_init_head(struct llist_header* head)
42 llist_append(struct llist_header* head, struct llist_header* elem)
44 __llist_add(elem, head->prev, head);
48 llist_prepend(struct llist_header* head, struct llist_header* elem)
50 __llist_add(elem, head, head->next);
54 llist_insert_after(struct llist_header* head, struct llist_header* elem)
56 __llist_add(elem, head, head->next);
60 llist_delete(struct llist_header* elem)
62 elem->prev->next = elem->next;
63 elem->next->prev = elem->prev;
71 llist_empty(struct llist_header* elem)
73 return elem->next == elem && elem->prev == elem;
76 #define DEFINE_LLIST(name) \
77 struct llist_header name = (struct llist_header) \
79 .prev = &name, .next = &name \
83 * list_entry - get the struct for this entry
84 * @ptr: the &struct list_head pointer.
85 * @type: the type of the struct this is embedded in.
86 * @member: the name of the list_struct within the struct.
88 #define list_entry(ptr, type, member) container_of(ptr, type, member)
91 * list_for_each_entry - iterate over list of given type
92 * @pos: the type * to use as a loop counter.
93 * @head: the head for your list.
94 * @member: the name of the list_struct within the struct.
96 #define llist_for_each(pos, n, head, member) \
97 for (pos = list_entry((head)->next, typeof(*pos), member), \
98 n = list_entry(pos->member.next, typeof(*pos), member); \
99 &pos->member != (head); \
100 pos = n, n = list_entry(n->member.next, typeof(*n), member))
104 struct hlist_node *next, **pprev;
108 hlist_delete(struct hlist_node* node)
112 *node->pprev = node->next;
118 hlist_add(struct hlist_node** head, struct hlist_node* node)
122 (*head)->pprev = &node->next;
127 #endif /* __LUNAIX_LLIST_H */