• Home
  • History
  • Annotate
  • 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