• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef __HLIST_H__
2 #define __HLIST_H__ 1
3 /* 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 hlist_head {
12 	struct hlist_node *first;
13 };
14 
15 struct hlist_node {
16 	struct hlist_node *next, **pprev;
17 };
18 
hlist_del(struct hlist_node * n)19 static inline void hlist_del(struct hlist_node *n)
20 {
21 	struct hlist_node *next = n->next;
22 	struct hlist_node **pprev = n->pprev;
23 	*pprev = next;
24 	if (next)
25 		next->pprev = pprev;
26 }
27 
hlist_add_head(struct hlist_node * n,struct hlist_head * h)28 static inline void hlist_add_head(struct hlist_node *n, struct hlist_head *h)
29 {
30 	struct hlist_node *first = h->first;
31 	n->next = first;
32 	if (first)
33 		first->pprev = &n->next;
34 	h->first = n;
35 	n->pprev = &h->first;
36 }
37 
38 #define hlist_for_each(pos, head) \
39 	for (pos = (head)->first; pos ; pos = pos->next)
40 
41 
42 #define hlist_for_each_safe(pos, n, head) \
43 	for (pos = (head)->first; pos && ({ n = pos->next; 1; }); \
44 	     pos = n)
45 
46 #define hlist_entry_safe(ptr, type, member) \
47 	({ typeof(ptr) ____ptr = (ptr); \
48 	   ____ptr ? hlist_entry(____ptr, type, member) : NULL; \
49 	})
50 
51 #define hlist_for_each_entry(pos, head, member)				\
52 	for (pos = hlist_entry_safe((head)->first, typeof(*(pos)), member);\
53 	     pos;							\
54 	     pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member))
55 
56 #endif /* __HLIST_H__ */
57