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_next - get the struct for next entry
92 * @ptr: the &struct list_head pointer.
93 * @type: the type of the struct this is embedded in.
94 * @member: the name of the list_struct within the struct.
96 #define list_next(current, type, member) container_of(current->member.next, type, member)
99 * list_prev - get the struct for prev entry
100 * @ptr: the &struct list_head pointer.
101 * @type: the type of the struct this is embedded in.
102 * @member: the name of the list_struct within the struct.
104 #define list_prev(current, type, member) container_of(current->member.prev, type, member)
107 * list_for_each_entry - iterate over list of given type
108 * @pos: the type * to use as a loop counter.
109 * @head: the head for your list.
110 * @member: the name of the list_struct within the struct.
112 #define llist_for_each(pos, n, head, member) \
113 for (pos = list_entry((head)->next, typeof(*pos), member), \
114 n = list_entry(pos->member.next, typeof(*pos), member); \
115 &pos->member != (head); \
116 pos = n, n = list_entry(n->member.next, typeof(*n), member))
120 struct hlist_node *next, **pprev;
124 hlist_delete(struct hlist_node* node)
128 *node->pprev = node->next;
134 hlist_add(struct hlist_node** head, struct hlist_node* node)
138 (*head)->pprev = &node->next;
143 #endif /* __LUNAIX_LLIST_H */