• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef __LIST_H__
2 #define __LIST_H__ 1
3 /* List and hash list stuff from kernel */
4 
5 #include <stddef.h>
6 
7 #define container_of(ptr, type, member) ({			\
8 	const typeof( ((type *)0)->member ) *__mptr = (ptr);	\
9 	(type *)( (char *)__mptr - offsetof(type,member) );})
10 
11 struct list_head {
12 	struct list_head *next, *prev;
13 };
14 
INIT_LIST_HEAD(struct list_head * list)15 static inline void INIT_LIST_HEAD(struct list_head *list)
16 {
17 	list->next = list;
18 	list->prev = list;
19 }
20 
__list_add(struct list_head * new,struct list_head * prev,struct list_head * next)21 static inline void __list_add(struct list_head *new,
22 			      struct list_head *prev,
23 			      struct list_head *next)
24 {
25 	next->prev = new;
26 	new->next = next;
27 	new->prev = prev;
28 	prev->next = new;
29 }
30 
list_add(struct list_head * new,struct list_head * head)31 static inline void list_add(struct list_head *new, struct list_head *head)
32 {
33 	__list_add(new, head, head->next);
34 }
35 
list_add_tail(struct list_head * new,struct list_head * head)36 static inline void list_add_tail(struct list_head *new, struct list_head *head)
37 {
38 	__list_add(new, head->prev, head);
39 }
40 
__list_del(struct list_head * prev,struct list_head * next)41 static inline void __list_del(struct list_head *prev, struct list_head *next)
42 {
43 	next->prev = prev;
44 	prev->next = next;
45 }
46 
list_del(struct list_head * entry)47 static inline void list_del(struct list_head *entry)
48 {
49 	__list_del(entry->prev, entry->next);
50 }
51 
52 #define list_entry(ptr, type, member) \
53 	container_of(ptr, type, member)
54 
55 #define list_first_entry(ptr, type, member) \
56 	list_entry((ptr)->next, type, member)
57 
58 #define list_last_entry(ptr, type, member) \
59 	list_entry((ptr)->prev, type, member)
60 
61 #define list_next_entry(pos, member) \
62 	list_entry((pos)->member.next, typeof(*(pos)), member)
63 
64 #define list_prev_entry(pos, member) \
65 	list_entry((pos)->member.prev, typeof(*(pos)), member)
66 
67 #define list_for_each_entry(pos, head, member)				\
68 	for (pos = list_first_entry(head, typeof(*pos), member);	\
69 	     &pos->member != (head);					\
70 	     pos = list_next_entry(pos, member))
71 
72 #define list_for_each_entry_safe(pos, n, head, member)			\
73 	for (pos = list_first_entry(head, typeof(*pos), member),	\
74 		n = list_next_entry(pos, member);			\
75 	     &pos->member != (head);					\
76 	     pos = n, n = list_next_entry(n, member))
77 
78 #define list_for_each_entry_reverse(pos, head, member)			\
79 	for (pos = list_last_entry(head, typeof(*pos), member);		\
80 	     &pos->member != (head);					\
81 	     pos = list_prev_entry(pos, member))
82 
83 struct hlist_head {
84 	struct hlist_node *first;
85 };
86 
87 struct hlist_node {
88 	struct hlist_node *next, **pprev;
89 };
90 
hlist_del(struct hlist_node * n)91 static inline void hlist_del(struct hlist_node *n)
92 {
93 	struct hlist_node *next = n->next;
94 	struct hlist_node **pprev = n->pprev;
95 	*pprev = next;
96 	if (next)
97 		next->pprev = pprev;
98 }
99 
hlist_add_head(struct hlist_node * n,struct hlist_head * h)100 static inline void hlist_add_head(struct hlist_node *n, struct hlist_head *h)
101 {
102 	struct hlist_node *first = h->first;
103 	n->next = first;
104 	if (first)
105 		first->pprev = &n->next;
106 	h->first = n;
107 	n->pprev = &h->first;
108 }
109 
110 #define hlist_for_each(pos, head) \
111 	for (pos = (head)->first; pos ; pos = pos->next)
112 
113 
114 #define hlist_for_each_safe(pos, n, head) \
115 	for (pos = (head)->first; pos && ({ n = pos->next; 1; }); \
116 	     pos = n)
117 
118 #define hlist_entry_safe(ptr, type, member) \
119 	({ typeof(ptr) ____ptr = (ptr); \
120 	   ____ptr ? hlist_entry(____ptr, type, member) : NULL; \
121 	})
122 
123 #define hlist_for_each_entry(pos, head, member)				\
124 	for (pos = hlist_entry_safe((head)->first, typeof(*(pos)), member);\
125 	     pos;							\
126 	     pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member))
127 
128 #endif /* __LIST_H__ */
129