4 * @brief This singly linked list is adopted from Linux kernel
9 * @copyright Copyright (c) 2024
12 #ifndef __LUNAIX_LIST_H
13 #define __LUNAIX_LIST_H
15 #include <lunaix/types.h>
18 struct list_node *first;
22 struct list_node *next;
25 #define DEFINE_LIST(name) struct list_head name = { .first = NULL }
28 list_head_init(struct list_head *list)
34 list_node_init(struct list_node *node)
39 #define slist_entry(ptr, type, member) \
40 container_of(ptr, type, member)
42 #define member_address_is_nonnull(ptr, member) \
43 ((ptr_t)(ptr) + offsetof(typeof(*(ptr)), member) != 0)
45 #define list_for_each(pos, n, node, member) \
46 for (pos = slist_entry((node), typeof(*pos), member); \
47 member_address_is_nonnull(pos, member) && \
48 (n = slist_entry(pos->member.next, typeof(*n), member), true); \
52 __llist_add_batch(struct list_node *new_first,
53 struct list_node *new_last,
54 struct list_head *head)
56 new_last->next = head->first;
57 head->first = new_first;
58 return new_last->next == NULL;
62 list_add(struct list_head* head, struct list_node* node)
64 __llist_add_batch(node, node, head);
67 #endif /* __LUNAIX_LIST_H */