1 // SPDX-License-Identifier: MIT
3 * Copyright 2022 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
9 struct side_list_node
{
10 struct side_list_node
*next
;
11 struct side_list_node
*prev
;
14 struct side_list_head
{
15 struct side_list_node node
;
18 #define DEFINE_SIDE_LIST_HEAD(_identifier) \
19 struct side_list_head _identifier = { \
21 .next = &(_identifier).node, \
22 .prev = &(_identifier).node, \
27 void side_list_insert_node_tail(struct side_list_head
*head
, struct side_list_node
*node
)
29 node
->next
= &head
->node
;
30 node
->prev
= head
->node
.prev
;
31 node
->prev
->next
= node
;
32 head
->node
.prev
= node
;
36 void side_list_insert_node_head(struct side_list_head
*head
, struct side_list_node
*node
)
38 node
->next
= head
->node
.next
;
39 node
->prev
= &head
->node
;
40 node
->next
->prev
= node
;
41 head
->node
.next
= node
;
45 void side_list_remove_node(struct side_list_node
*node
)
47 node
->next
->prev
= node
->prev
;
48 node
->prev
->next
= node
->next
;
51 #define side_list_for_each_entry(_entry, _head, _member) \
52 for ((_entry) = side_container_of((_head)->node.next, __typeof__(*(_entry)), _member); \
53 &(_entry)->_member != &(_head)->node; \
54 (_entry) = side_container_of((_entry)->_member.next, __typeof__(*(_entry)), _member))
56 /* List iteration, safe against node reclaim while iterating. */
57 #define side_list_for_each_entry_safe(_entry, _next_entry, _head, _member) \
58 for ((_entry) = side_container_of((_head)->node.next, __typeof__(*(_entry)), _member), \
59 (_next_entry) = side_container_of((_entry)->_member.next, __typeof__(*(_entry)), _member); \
60 &(_entry)->_member != &(_head)->node; \
61 (_entry) = side_container_of((_next_entry)->_member.next, __typeof__(*(_entry)), _member), \
62 (_next_entry) = side_container_of((_entry)->_member.next, __typeof__(*(_entry)), _member))
64 #endif /* _SIDE_LIST_H */
This page took 0.041054 seconds and 5 git commands to generate.