xref: /aosp_15_r20/external/bpftool/include/linux/list.h (revision 858ea5e570667251cdc31d3fe7b846b591105938)
1 /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
2 
3 #ifndef __LINUX_LIST_H
4 #define __LINUX_LIST_H
5 
6 #include <linux/types.h>
7 
8 #define LIST_HEAD_INIT(name) { &(name), &(name) }
9 #define LIST_HEAD(name) \
10         struct list_head name = LIST_HEAD_INIT(name)
11 
12 #define POISON_POINTER_DELTA 0
13 #define LIST_POISON1  ((void *) 0x100 + POISON_POINTER_DELTA)
14 #define LIST_POISON2  ((void *) 0x200 + POISON_POINTER_DELTA)
15 
16 
INIT_LIST_HEAD(struct list_head * list)17 static inline void INIT_LIST_HEAD(struct list_head *list)
18 {
19         list->next = list;
20         list->prev = list;
21 }
22 
__list_add(struct list_head * new,struct list_head * prev,struct list_head * next)23 static inline void __list_add(struct list_head *new,
24                               struct list_head *prev,
25                               struct list_head *next)
26 {
27         next->prev = new;
28         new->next = next;
29         new->prev = prev;
30         prev->next = new;
31 }
32 
33 /**
34  * list_add - add a new entry
35  * @new: new entry to be added
36  * @head: list head to add it after
37  *
38  * Insert a new entry after the specified head.
39  * This is good for implementing stacks.
40  */
list_add(struct list_head * new,struct list_head * head)41 static inline void list_add(struct list_head *new, struct list_head *head)
42 {
43         __list_add(new, head, head->next);
44 }
45 
46 
47 /**
48  * list_add_tail - add a new entry
49  * @new: new entry to be added
50  * @head: list head to add it before
51  *
52  * Insert a new entry before the specified head.
53  * This is useful for implementing queues.
54  */
list_add_tail(struct list_head * new,struct list_head * head)55 static inline void list_add_tail(struct list_head *new, struct list_head *head)
56 {
57         __list_add(new, head->prev, head);
58 }
59 
60 /*
61  * Delete a list entry by making the prev/next entries
62  * point to each other.
63  *
64  * This is only for internal list manipulation where we know
65  * the prev/next entries already!
66  */
__list_del(struct list_head * prev,struct list_head * next)67 static inline void __list_del(struct list_head * prev, struct list_head * next)
68 {
69         next->prev = prev;
70         prev->next = next;
71 }
72 
73 /**
74  * list_del - deletes entry from list.
75  * @entry: the element to delete from the list.
76  * Note: list_empty() on entry does not return true after this, the entry is
77  * in an undefined state.
78  */
__list_del_entry(struct list_head * entry)79 static inline void __list_del_entry(struct list_head *entry)
80 {
81         __list_del(entry->prev, entry->next);
82 }
83 
list_del(struct list_head * entry)84 static inline void list_del(struct list_head *entry)
85 {
86         __list_del(entry->prev, entry->next);
87         entry->next = LIST_POISON1;
88         entry->prev = LIST_POISON2;
89 }
90 
list_empty(const struct list_head * head)91 static inline int list_empty(const struct list_head *head)
92 {
93 	return head->next == head;
94 }
95 
96 #define list_entry(ptr, type, member) \
97         container_of(ptr, type, member)
98 #define list_first_entry(ptr, type, member) \
99         list_entry((ptr)->next, type, member)
100 #define list_last_entry(ptr, type, member) \
101         list_entry((ptr)->prev, type, member)
102 #define list_next_entry(pos, member) \
103         list_entry((pos)->member.next, typeof(*(pos)), member)
104 #define list_prev_entry(pos, member) \
105         list_entry((pos)->member.prev, typeof(*(pos)), member)
106 #define list_for_each_entry(pos, head, member) \
107 	for (pos = list_first_entry(head, typeof(*pos), member); \
108 	     &pos->member != (head); \
109 	     pos = list_next_entry(pos, member))
110 #define list_for_each_entry_from(pos, head, member) \
111 	for (; &pos->member != (head); \
112 	     pos = list_next_entry(pos, member))
113 #define list_for_each_entry_safe(pos, n, head, member) \
114 	for (pos = list_first_entry(head, typeof(*pos), member), \
115 		n = list_next_entry(pos, member); \
116 	     &pos->member != (head); \
117 	     pos = n, n = list_next_entry(n, member))
118 
119 #endif
120