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;
62 * list_entry - get the struct for this entry
63 * @ptr: the &struct list_head pointer.
64 * @type: the type of the struct this is embedded in.
65 * @member: the name of the list_struct within the struct.
67 #define list_entry(ptr, type, member) \
68 container_of(ptr, type, member)
71 * list_for_each_entry - iterate over list of given type
72 * @pos: the type * to use as a loop counter.
73 * @head: the head for your list.
74 * @member: the name of the list_struct within the struct.
76 #define llist_for_each(pos, n, head, member) \
77 for (pos = list_entry((head)->next, typeof(*pos), member), \
78 n = list_entry(pos->member.next, typeof(*pos), member); \
79 &pos->member != (head); \
80 pos = n, n = list_entry(n->member.next, typeof(*n), member))
82 #endif /* __LUNAIX_LLIST_H */