annotate mcabber/src/list.h @ 403:17aa60c6dc63

Allow a different server name than the jid domain name Sync libjabber with upstream (centericq). The libjabber patch is from Ian Johannesen. This allows connecting to Google Talk, for example.
author Mikael Berthe <mikael@lilotux.net>
date Sat, 27 Aug 2005 11:21:27 +0200
parents f8f3c7493457
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
24
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
1 #ifndef _LINUX_LIST_H
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
2 #define _LINUX_LIST_H
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
3
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
4 /*
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
5 * Simple doubly linked list implementation.
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
6 *
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
7 * Some of the internal functions ("__xxx") are useful when
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
8 * manipulating whole lists rather than single entries, as
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
9 * sometimes we already know the next/prev entries and we can
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
10 * generate better code by using them directly rather than
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
11 * using the generic single-entry routines.
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
12 */
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
13
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
14 struct list_head {
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
15 struct list_head *next, *prev;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
16 };
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
17
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
18 #define LIST_HEAD_INIT(name) { &(name), &(name) }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
19
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
20 #define LIST_HEAD(name) \
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
21 struct list_head name = LIST_HEAD_INIT(name)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
22
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
23 #define INIT_LIST_HEAD(ptr) do { \
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
24 (ptr)->next = (ptr); (ptr)->prev = (ptr); \
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
25 } while (0)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
26
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
27 /*
393
f8f3c7493457 Whitespace cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 28
diff changeset
28 * Insert a new entry between two known consecutive entries.
24
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
29 *
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
30 * This is only for internal list manipulation where we know
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
31 * the prev/next entries already!
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
32 */
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
33 static inline void
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
34 __list_add(struct list_head *new,
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
35 struct list_head *prev, struct list_head *next)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
36 {
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
37 next->prev = new;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
38 new->next = next;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
39 new->prev = prev;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
40 prev->next = new;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
41 }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
42
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
43 /**
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
44 * list_add - add a new entry
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
45 * @new: new entry to be added
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
46 * @head: list head to add it after
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
47 *
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
48 * Insert a new entry after the specified head.
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
49 * This is good for implementing stacks.
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
50 */
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
51 static inline void list_add(struct list_head *new, struct list_head *head)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
52 {
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
53 __list_add(new, head, head->next);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
54 }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
55
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
56 /**
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
57 * list_add_tail - add a new entry
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
58 * @new: new entry to be added
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
59 * @head: list head to add it before
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
60 *
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
61 * Insert a new entry before the specified head.
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
62 * This is useful for implementing queues.
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
63 */
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
64 static inline void
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
65 list_add_tail(struct list_head *new, struct list_head *head)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
66 {
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
67 __list_add(new, head->prev, head);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
68 }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
69
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
70 /*
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
71 * Delete a list entry by making the prev/next entries
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
72 * point to each other.
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
73 *
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
74 * This is only for internal list manipulation where we know
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
75 * the prev/next entries already!
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
76 */
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
77 static inline void
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
78 __list_del(struct list_head *prev, struct list_head *next)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
79 {
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
80 next->prev = prev;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
81 prev->next = next;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
82 }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
83
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
84 /**
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
85 * list_del - deletes entry from list.
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
86 * @entry: the element to delete from the list.
28
0cd8025eebee [/trunk] Changeset 44 by mikael
mikael
parents: 24
diff changeset
87 * Note: list_empty on entry does not return true after this, the entry is
0cd8025eebee [/trunk] Changeset 44 by mikael
mikael
parents: 24
diff changeset
88 * in an undefined state.
24
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
89 */
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
90 static inline void list_del(struct list_head *entry)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
91 {
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
92 __list_del(entry->prev, entry->next);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
93 entry->next = (void *) 0;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
94 entry->prev = (void *) 0;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
95 }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
96
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
97 /**
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
98 * list_del_init - deletes entry from list and reinitialize it.
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
99 * @entry: the element to delete from the list.
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
100 */
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
101 static inline void list_del_init(struct list_head *entry)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
102 {
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
103 __list_del(entry->prev, entry->next);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
104 INIT_LIST_HEAD(entry);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
105 }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
106
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
107 /**
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
108 * list_move - delete from one list and add as another's head
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
109 * @list: the entry to move
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
110 * @head: the head that will precede our entry
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
111 */
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
112 static inline void
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
113 list_move(struct list_head *list, struct list_head *head)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
114 {
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
115 __list_del(list->prev, list->next);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
116 list_add(list, head);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
117 }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
118
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
119 /**
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
120 * list_move_tail - delete from one list and add as another's tail
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
121 * @list: the entry to move
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
122 * @head: the head that will follow our entry
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
123 */
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
124 static inline void
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
125 list_move_tail(struct list_head *list, struct list_head *head)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
126 {
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
127 __list_del(list->prev, list->next);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
128 list_add_tail(list, head);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
129 }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
130
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
131 /**
28
0cd8025eebee [/trunk] Changeset 44 by mikael
mikael
parents: 24
diff changeset
132 * list_empty - test whether a list is empty
24
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
133 * @head: the list to test.
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
134 */
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
135 static inline int list_empty(struct list_head *head)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
136 {
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
137 return head->next == head;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
138 }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
139
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
140 static inline void
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
141 __list_splice(struct list_head *list, struct list_head *head)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
142 {
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
143 struct list_head *first = list->next;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
144 struct list_head *last = list->prev;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
145 struct list_head *at = head->next;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
146
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
147 first->prev = head;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
148 head->next = first;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
149
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
150 last->next = at;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
151 at->prev = last;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
152 }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
153
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
154 /**
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
155 * list_splice - join two lists
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
156 * @list: the new list to add.
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
157 * @head: the place to add it in the first list.
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
158 */
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
159 static inline void
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
160 list_splice(struct list_head *list, struct list_head *head)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
161 {
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
162 if (!list_empty(list))
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
163 __list_splice(list, head);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
164 }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
165
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
166 /**
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
167 * list_splice_init - join two lists and reinitialise the emptied list.
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
168 * @list: the new list to add.
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
169 * @head: the place to add it in the first list.
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
170 *
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
171 * The list at @list is reinitialised
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
172 */
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
173 static inline void
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
174 list_splice_init(struct list_head *list, struct list_head *head)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
175 {
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
176 if (!list_empty(list)) {
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
177 __list_splice(list, head);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
178 INIT_LIST_HEAD(list);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
179 }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
180 }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
181
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
182 /**
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
183 * list_entry - get the struct for this entry
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
184 * @ptr: the &struct list_head pointer.
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
185 * @type: the type of the struct this is embedded in.
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
186 * @member: the name of the list_struct within the struct.
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
187 */
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
188 #define list_entry(ptr, type, member) \
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
189 ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
190
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
191 /**
28
0cd8025eebee [/trunk] Changeset 44 by mikael
mikael
parents: 24
diff changeset
192 * list_for_each_safe - iterate over a list safe against removal of list entry
24
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
193 * @pos: the &struct list_head to use as a loop counter.
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
194 * @n: another &struct list_head to use as temporary storage
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
195 * @head: the head for your list.
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
196 */
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
197 #define list_for_each_safe(pos, n, head) \
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
198 for (pos = (head)->next, n = pos->next; pos != (head); \
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
199 pos = n, n = pos->next)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
200
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
201 /**
28
0cd8025eebee [/trunk] Changeset 44 by mikael
mikael
parents: 24
diff changeset
202 * list_for_each_entry_safe - iterate over list of given type safe against
0cd8025eebee [/trunk] Changeset 44 by mikael
mikael
parents: 24
diff changeset
203 * removal of list entry
24
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
204 * @pos: the type * to use as a loop counter.
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
205 * @n: another type * to use as temporary storage
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
206 * @head: the head for your list.
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
207 * @member: the name of the list_struct within the struct.
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
208 */
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
209 #define list_for_each_entry_safe(pos, n, head, member) \
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
210 for (pos = list_entry((head)->next, typeof(*pos), member), \
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
211 n = list_entry(pos->member.next, typeof(*pos), member); \
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
212 &pos->member != (head); \
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
213 pos = n, n = list_entry(n->member.next, typeof(*n), member))
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
214
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
215 #endif