xref: /aosp_15_r20/external/trace-cmd/tracecmd/include/list.h (revision 58e6ee5f017f6a8912852c892d18457e4bafb554)
1*58e6ee5fSAndroid Build Coastguard Worker /* SPDX-License-Identifier: LGPL-2.1 */
2*58e6ee5fSAndroid Build Coastguard Worker /*
3*58e6ee5fSAndroid Build Coastguard Worker  * Copyright (C) 2009 Red Hat Inc, Steven Rostedt <[email protected]>
4*58e6ee5fSAndroid Build Coastguard Worker  *
5*58e6ee5fSAndroid Build Coastguard Worker  */
6*58e6ee5fSAndroid Build Coastguard Worker #ifndef __LIST_H
7*58e6ee5fSAndroid Build Coastguard Worker #define __LIST_H
8*58e6ee5fSAndroid Build Coastguard Worker 
9*58e6ee5fSAndroid Build Coastguard Worker #define offset_of(type, field)		__builtin_offsetof(type, field)
10*58e6ee5fSAndroid Build Coastguard Worker #define container_of(p, type, field)	(type *)((long)p - offset_of(type, field))
11*58e6ee5fSAndroid Build Coastguard Worker 
12*58e6ee5fSAndroid Build Coastguard Worker struct list_head {
13*58e6ee5fSAndroid Build Coastguard Worker 	struct list_head *next;
14*58e6ee5fSAndroid Build Coastguard Worker 	struct list_head *prev;
15*58e6ee5fSAndroid Build Coastguard Worker };
16*58e6ee5fSAndroid Build Coastguard Worker 
list_head_init(struct list_head * list)17*58e6ee5fSAndroid Build Coastguard Worker static inline void list_head_init(struct list_head *list)
18*58e6ee5fSAndroid Build Coastguard Worker {
19*58e6ee5fSAndroid Build Coastguard Worker 	list->next = list;
20*58e6ee5fSAndroid Build Coastguard Worker 	list->prev = list;
21*58e6ee5fSAndroid Build Coastguard Worker }
22*58e6ee5fSAndroid Build Coastguard Worker 
list_add(struct list_head * p,struct list_head * head)23*58e6ee5fSAndroid Build Coastguard Worker static inline void list_add(struct list_head *p, struct list_head *head)
24*58e6ee5fSAndroid Build Coastguard Worker {
25*58e6ee5fSAndroid Build Coastguard Worker 	struct list_head *next = head->next;
26*58e6ee5fSAndroid Build Coastguard Worker 
27*58e6ee5fSAndroid Build Coastguard Worker 	p->prev = head;
28*58e6ee5fSAndroid Build Coastguard Worker 	p->next = next;
29*58e6ee5fSAndroid Build Coastguard Worker 	next->prev = p;
30*58e6ee5fSAndroid Build Coastguard Worker 	head->next = p;
31*58e6ee5fSAndroid Build Coastguard Worker }
32*58e6ee5fSAndroid Build Coastguard Worker 
list_add_tail(struct list_head * p,struct list_head * head)33*58e6ee5fSAndroid Build Coastguard Worker static inline void list_add_tail(struct list_head *p, struct list_head *head)
34*58e6ee5fSAndroid Build Coastguard Worker {
35*58e6ee5fSAndroid Build Coastguard Worker 	struct list_head *prev = head->prev;
36*58e6ee5fSAndroid Build Coastguard Worker 
37*58e6ee5fSAndroid Build Coastguard Worker 	p->prev = prev;
38*58e6ee5fSAndroid Build Coastguard Worker 	p->next = head;
39*58e6ee5fSAndroid Build Coastguard Worker 	prev->next = p;
40*58e6ee5fSAndroid Build Coastguard Worker 	head->prev = p;
41*58e6ee5fSAndroid Build Coastguard Worker }
42*58e6ee5fSAndroid Build Coastguard Worker 
list_del(struct list_head * p)43*58e6ee5fSAndroid Build Coastguard Worker static inline void list_del(struct list_head *p)
44*58e6ee5fSAndroid Build Coastguard Worker {
45*58e6ee5fSAndroid Build Coastguard Worker 	struct list_head *next = p->next;
46*58e6ee5fSAndroid Build Coastguard Worker 	struct list_head *prev = p->prev;
47*58e6ee5fSAndroid Build Coastguard Worker 
48*58e6ee5fSAndroid Build Coastguard Worker 	next->prev = prev;
49*58e6ee5fSAndroid Build Coastguard Worker 	prev->next = next;
50*58e6ee5fSAndroid Build Coastguard Worker }
51*58e6ee5fSAndroid Build Coastguard Worker 
list_empty(struct list_head * list)52*58e6ee5fSAndroid Build Coastguard Worker static inline int list_empty(struct list_head *list)
53*58e6ee5fSAndroid Build Coastguard Worker {
54*58e6ee5fSAndroid Build Coastguard Worker 	return list->next == list;
55*58e6ee5fSAndroid Build Coastguard Worker }
56*58e6ee5fSAndroid Build Coastguard Worker 
57*58e6ee5fSAndroid Build Coastguard Worker #define list_for_each_entry(p, list, field)		\
58*58e6ee5fSAndroid Build Coastguard Worker 	for (p = container_of((list)->next, typeof(*p), field);	\
59*58e6ee5fSAndroid Build Coastguard Worker 	     &(p)->field != list;				\
60*58e6ee5fSAndroid Build Coastguard Worker 	     p = container_of((p)->field.next, typeof(*p), field))
61*58e6ee5fSAndroid Build Coastguard Worker 
62*58e6ee5fSAndroid Build Coastguard Worker #define list_for_each_entry_safe(p, n, list, field)			\
63*58e6ee5fSAndroid Build Coastguard Worker 	for (p = container_of((list)->next, typeof(*p), field),		\
64*58e6ee5fSAndroid Build Coastguard Worker 		     n = container_of((p)->field.next, typeof(*p), field); \
65*58e6ee5fSAndroid Build Coastguard Worker 	     &(p)->field != list;					\
66*58e6ee5fSAndroid Build Coastguard Worker 	     p = n, n = container_of((p)->field.next, typeof(*p), field))
67*58e6ee5fSAndroid Build Coastguard Worker 
68*58e6ee5fSAndroid Build Coastguard Worker #endif /* __LIST_H */
69