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