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/common.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_delete(struct llist_header* elem)
56 elem->prev->next = elem->next;
57 elem->next->prev = elem->prev;
65 llist_empty(struct llist_header* elem)
67 return elem->next == elem && elem->prev == elem;
70 #define DEFINE_LLIST(name) \
71 struct llist_header name = (struct llist_header) \
73 .prev = &name, .next = &name \
77 * list_entry - get the struct for this entry
78 * @ptr: the &struct list_head pointer.
79 * @type: the type of the struct this is embedded in.
80 * @member: the name of the list_struct within the struct.
82 #define list_entry(ptr, type, member) container_of(ptr, type, member)
85 * list_for_each_entry - iterate over list of given type
86 * @pos: the type * to use as a loop counter.
87 * @head: the head for your list.
88 * @member: the name of the list_struct within the struct.
90 #define llist_for_each(pos, n, head, member) \
91 for (pos = list_entry((head)->next, typeof(*pos), member), \
92 n = list_entry(pos->member.next, typeof(*pos), member); \
93 &pos->member != (head); \
94 pos = n, n = list_entry(n->member.next, typeof(*n), member))
98 struct hlist_node *next, **pprev;
102 hlist_delete(struct hlist_node* node)
106 *node->pprev = node->next;
112 hlist_add(struct hlist_node** head, struct hlist_node* node)
116 (*head)->pprev = &node->next;
121 #endif /* __LUNAIX_LLIST_H */