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;
71 * list_entry - get the struct for this entry
72 * @ptr: the &struct list_head pointer.
73 * @type: the type of the struct this is embedded in.
74 * @member: the name of the list_struct within the struct.
76 #define list_entry(ptr, type, member) container_of(ptr, type, member)
79 * list_for_each_entry - iterate over list of given type
80 * @pos: the type * to use as a loop counter.
81 * @head: the head for your list.
82 * @member: the name of the list_struct within the struct.
84 #define llist_for_each(pos, n, head, member) \
85 for (pos = list_entry((head)->next, typeof(*pos), member), \
86 n = list_entry(pos->member.next, typeof(*pos), member); \
87 &pos->member != (head); \
88 pos = n, n = list_entry(n->member.next, typeof(*n), member))
92 struct hlist_node *next, **pprev;
96 hlist_del(struct hlist_node* node)
98 *node->pprev = node->next;
104 hlist_add(struct hlist_node** head, struct hlist_node* node)
108 (*head)->pprev = &node->next;
113 #endif /* __LUNAIX_LLIST_H */