Whamcloud - gitweb
* ranal passes netregression
[fs/lustre-release.git] / lnet / include / lnet / list.h
1 #ifndef _LINUX_LIST_H
2 /*
3  * Simple doubly linked list implementation.
4  *
5  * Some of the internal functions ("__xxx") are useful when
6  * manipulating whole lists rather than single entries, as
7  * sometimes we already know the next/prev entries and we can
8  * generate better code by using them directly rather than
9  * using the generic single-entry routines.
10  */
11
12 struct list_head {
13         struct list_head *next, *prev;
14 };
15
16 typedef struct list_head list_t;
17
18 #define LIST_HEAD_INIT(name) { &(name), &(name) }
19
20 #define LIST_HEAD(name) \
21         struct list_head name = LIST_HEAD_INIT(name)
22
23 #define INIT_LIST_HEAD(ptr) do { \
24         (ptr)->next = (ptr); (ptr)->prev = (ptr); \
25 } while (0)
26
27 /*
28  * Insert a new entry between two known consecutive entries.
29  *
30  * This is only for internal list manipulation where we know
31  * the prev/next entries already!
32  */
33 static inline void __list_add(struct list_head * new,
34                               struct list_head * prev,
35                               struct list_head * next)
36 {
37         next->prev = new;
38         new->next = next;
39         new->prev = prev;
40         prev->next = new;
41 }
42
43 /**
44  * list_add - add a new entry
45  * @new: new entry to be added
46  * @head: list head to add it after
47  *
48  * Insert a new entry after the specified head.
49  * This is good for implementing stacks.
50  */
51 static inline void list_add(struct list_head *new, struct list_head *head)
52 {
53         __list_add(new, head, head->next);
54 }
55
56 /**
57  * list_add_tail - add a new entry
58  * @new: new entry to be added
59  * @head: list head to add it before
60  *
61  * Insert a new entry before the specified head.
62  * This is useful for implementing queues.
63  */
64 static inline void list_add_tail(struct list_head *new, struct list_head *head)
65 {
66         __list_add(new, head->prev, head);
67 }
68
69 /*
70  * Delete a list entry by making the prev/next entries
71  * point to each other.
72  *
73  * This is only for internal list manipulation where we know
74  * the prev/next entries already!
75  */
76 static inline void __list_del(struct list_head * prev, struct list_head * next)
77 {
78         next->prev = prev;
79         prev->next = next;
80 }
81
82 /**
83  * list_del - deletes entry from list.
84  * @entry: the element to delete from the list.
85  * Note: list_empty on entry does not return true after this, the entry is in an undefined state.
86  */
87 static inline void list_del(struct list_head *entry)
88 {
89         __list_del(entry->prev, entry->next);
90 }
91
92 /**
93  * list_del_init - deletes entry from list and reinitialize it.
94  * @entry: the element to delete from the list.
95  */
96 static inline void list_del_init(struct list_head *entry)
97 {
98         __list_del(entry->prev, entry->next);
99         INIT_LIST_HEAD(entry);
100 }
101 #endif
102
103 #ifndef list_for_each_entry
104 /**
105  * list_move - delete from one list and add as another's head
106  * @list: the entry to move
107  * @head: the head that will precede our entry
108  */
109 static inline void list_move(struct list_head *list, struct list_head *head)
110 {
111         __list_del(list->prev, list->next);
112         list_add(list, head);
113 }
114
115 /**
116  * list_move_tail - delete from one list and add as another's tail
117  * @list: the entry to move
118  * @head: the head that will follow our entry
119  */
120 static inline void list_move_tail(struct list_head *list,
121                                   struct list_head *head)
122 {
123         __list_del(list->prev, list->next);
124         list_add_tail(list, head);
125 }
126 #endif
127
128 #ifndef _LINUX_LIST_H
129 #define _LINUX_LIST_H
130 /**
131  * list_empty - tests whether a list is empty
132  * @head: the list to test.
133  */
134 static inline int list_empty(struct list_head *head)
135 {
136         return head->next == head;
137 }
138
139 static inline void __list_splice(struct list_head *list,
140                                  struct list_head *head)
141 {
142         struct list_head *first = list->next;
143         struct list_head *last = list->prev;
144         struct list_head *at = head->next;
145
146         first->prev = head;
147         head->next = first;
148
149         last->next = at;
150         at->prev = last;
151 }
152
153 /**
154  * list_splice - join two lists
155  * @list: the new list to add.
156  * @head: the place to add it in the first list.
157  */
158 static inline void list_splice(struct list_head *list, struct list_head *head)
159 {
160         if (!list_empty(list))
161                 __list_splice(list, head);
162 }
163
164 /**
165  * list_splice_init - join two lists and reinitialise the emptied list.
166  * @list: the new list to add.
167  * @head: the place to add it in the first list.
168  *
169  * The list at @list is reinitialised
170  */
171 static inline void list_splice_init(struct list_head *list,
172                                     struct list_head *head)
173 {
174         if (!list_empty(list)) {
175                 __list_splice(list, head);
176                 INIT_LIST_HEAD(list);
177         }
178 }
179
180 /**
181  * list_entry - get the struct for this entry
182  * @ptr:        the &struct list_head pointer.
183  * @type:       the type of the struct this is embedded in.
184  * @member:     the name of the list_struct within the struct.
185  */
186 #define list_entry(ptr, type, member) \
187         ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
188
189 /**
190  * list_for_each        -       iterate over a list
191  * @pos:        the &struct list_head to use as a loop counter.
192  * @head:       the head for your list.
193  */
194 #define list_for_each(pos, head) \
195         for (pos = (head)->next ; pos != (head); pos = pos->next )
196
197 /**
198  * list_for_each_prev   -       iterate over a list in reverse order
199  * @pos:        the &struct list_head to use as a loop counter.
200  * @head:       the head for your list.
201  */
202 #define list_for_each_prev(pos, head) \
203         for (pos = (head)->prev ; pos != (head); pos = pos->prev)
204
205 /**
206  * list_for_each_safe   -       iterate over a list safe against removal of list entry
207  * @pos:        the &struct list_head to use as a loop counter.
208  * @n:          another &struct list_head to use as temporary storage
209  * @head:       the head for your list.
210  */
211 #define list_for_each_safe(pos, n, head) \
212         for (pos = (head)->next, n = pos->next; pos != (head); \
213                 pos = n, n = pos->next)
214
215 #endif
216
217 #ifndef list_for_each_entry
218 /**
219  * list_for_each_entry  -       iterate over list of given type
220  * @pos:        the type * to use as a loop counter.
221  * @head:       the head for your list.
222  * @member:     the name of the list_struct within the struct.
223  */
224 #define list_for_each_entry(pos, head, member)                          \
225         for (pos = list_entry((head)->next, typeof(*pos), member);      \
226              &pos->member != (head);                                    \
227              pos = list_entry(pos->member.next, typeof(*pos), member))
228 #endif
229
230 #ifndef list_for_each_entry_safe
231 /**
232  * list_for_each_entry_safe  -       iterate over list of given type safe against removal of list entry
233  * @pos:        the type * to use as a loop counter.
234  * @n:          another type * to use as temporary storage
235  * @head:       the head for your list.
236  * @member:     the name of the list_struct within the struct.
237  */
238 #define list_for_each_entry_safe(pos, n, head, member)                  \
239         for (pos = list_entry((head)->next, typeof(*pos), member),      \
240                 n = list_entry(pos->member.next, typeof(*pos), member); \
241              &pos->member != (head);                                    \
242              pos = n, n = list_entry(n->member.next, typeof(*n), member))
243 #endif