1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 #ifndef _SYS_QUEUE_H_
36 #define _SYS_QUEUE_H_
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88 #define SLIST_HEAD(name, type) \
89 struct name { \
90 struct type *slh_first; \
91 }
92
93 #define SLIST_HEAD_INITIALIZER(head) \
94 { NULL }
95
96 #ifndef WIN32
97 #define SLIST_ENTRY(type) \
98 struct { \
99 struct type *sle_next; \
100 }
101 #endif
102
103
104
105
106 #define SLIST_FIRST(head) ((head)->slh_first)
107 #define SLIST_END(head) NULL
108 #define SLIST_EMPTY(head) (SLIST_FIRST(head) == SLIST_END(head))
109 #define SLIST_NEXT(elm, field) ((elm)->field.sle_next)
110
111 #define SLIST_FOREACH(var, head, field) \
112 for((var) = SLIST_FIRST(head); \
113 (var) != SLIST_END(head); \
114 (var) = SLIST_NEXT(var, field))
115
116
117
118
119 #define SLIST_INIT(head) { \
120 SLIST_FIRST(head) = SLIST_END(head); \
121 }
122
123 #define SLIST_INSERT_AFTER(slistelm, elm, field) do { \
124 (elm)->field.sle_next = (slistelm)->field.sle_next; \
125 (slistelm)->field.sle_next = (elm); \
126 } while (0)
127
128 #define SLIST_INSERT_HEAD(head, elm, field) do { \
129 (elm)->field.sle_next = (head)->slh_first; \
130 (head)->slh_first = (elm); \
131 } while (0)
132
133 #define SLIST_REMOVE_HEAD(head, field) do { \
134 (head)->slh_first = (head)->slh_first->field.sle_next; \
135 } while (0)
136
137
138
139
140 #define LIST_HEAD(name, type) \
141 struct name { \
142 struct type *lh_first; \
143 }
144
145 #define LIST_HEAD_INITIALIZER(head) \
146 { NULL }
147
148 #define LIST_ENTRY(type) \
149 struct { \
150 struct type *le_next; \
151 struct type **le_prev; \
152 }
153
154
155
156
157 #define LIST_FIRST(head) ((head)->lh_first)
158 #define LIST_END(head) NULL
159 #define LIST_EMPTY(head) (LIST_FIRST(head) == LIST_END(head))
160 #define LIST_NEXT(elm, field) ((elm)->field.le_next)
161
162 #define LIST_FOREACH(var, head, field) \
163 for((var) = LIST_FIRST(head); \
164 (var)!= LIST_END(head); \
165 (var) = LIST_NEXT(var, field))
166
167
168
169
170 #define LIST_INIT(head) do { \
171 LIST_FIRST(head) = LIST_END(head); \
172 } while (0)
173
174 #define LIST_INSERT_AFTER(listelm, elm, field) do { \
175 if (((elm)->field.le_next = (listelm)->field.le_next) != NULL) \
176 (listelm)->field.le_next->field.le_prev = \
177 &(elm)->field.le_next; \
178 (listelm)->field.le_next = (elm); \
179 (elm)->field.le_prev = &(listelm)->field.le_next; \
180 } while (0)
181
182 #define LIST_INSERT_BEFORE(listelm, elm, field) do { \
183 (elm)->field.le_prev = (listelm)->field.le_prev; \
184 (elm)->field.le_next = (listelm); \
185 *(listelm)->field.le_prev = (elm); \
186 (listelm)->field.le_prev = &(elm)->field.le_next; \
187 } while (0)
188
189 #define LIST_INSERT_HEAD(head, elm, field) do { \
190 if (((elm)->field.le_next = (head)->lh_first) != NULL) \
191 (head)->lh_first->field.le_prev = &(elm)->field.le_next;\
192 (head)->lh_first = (elm); \
193 (elm)->field.le_prev = &(head)->lh_first; \
194 } while (0)
195
196 #define LIST_REMOVE(elm, field) do { \
197 if ((elm)->field.le_next != NULL) \
198 (elm)->field.le_next->field.le_prev = \
199 (elm)->field.le_prev; \
200 *(elm)->field.le_prev = (elm)->field.le_next; \
201 } while (0)
202
203 #define LIST_REPLACE(elm, elm2, field) do { \
204 if (((elm2)->field.le_next = (elm)->field.le_next) != NULL) \
205 (elm2)->field.le_next->field.le_prev = \
206 &(elm2)->field.le_next; \
207 (elm2)->field.le_prev = (elm)->field.le_prev; \
208 *(elm2)->field.le_prev = (elm2); \
209 } while (0)
210
211
212
213
214 #define SIMPLEQ_HEAD(name, type) \
215 struct name { \
216 struct type *sqh_first; \
217 struct type **sqh_last; \
218 }
219
220 #define SIMPLEQ_HEAD_INITIALIZER(head) \
221 { NULL, &(head).sqh_first }
222
223 #define SIMPLEQ_ENTRY(type) \
224 struct { \
225 struct type *sqe_next; \
226 }
227
228
229
230
231 #define SIMPLEQ_FIRST(head) ((head)->sqh_first)
232 #define SIMPLEQ_END(head) NULL
233 #define SIMPLEQ_EMPTY(head) (SIMPLEQ_FIRST(head) == SIMPLEQ_END(head))
234 #define SIMPLEQ_NEXT(elm, field) ((elm)->field.sqe_next)
235
236 #define SIMPLEQ_FOREACH(var, head, field) \
237 for((var) = SIMPLEQ_FIRST(head); \
238 (var) != SIMPLEQ_END(head); \
239 (var) = SIMPLEQ_NEXT(var, field))
240
241
242
243
244 #define SIMPLEQ_INIT(head) do { \
245 (head)->sqh_first = NULL; \
246 (head)->sqh_last = &(head)->sqh_first; \
247 } while (0)
248
249 #define SIMPLEQ_INSERT_HEAD(head, elm, field) do { \
250 if (((elm)->field.sqe_next = (head)->sqh_first) == NULL) \
251 (head)->sqh_last = &(elm)->field.sqe_next; \
252 (head)->sqh_first = (elm); \
253 } while (0)
254
255 #define SIMPLEQ_INSERT_TAIL(head, elm, field) do { \
256 (elm)->field.sqe_next = NULL; \
257 *(head)->sqh_last = (elm); \
258 (head)->sqh_last = &(elm)->field.sqe_next; \
259 } while (0)
260
261 #define SIMPLEQ_INSERT_AFTER(head, listelm, elm, field) do { \
262 if (((elm)->field.sqe_next = (listelm)->field.sqe_next) == NULL)\
263 (head)->sqh_last = &(elm)->field.sqe_next; \
264 (listelm)->field.sqe_next = (elm); \
265 } while (0)
266
267 #define SIMPLEQ_REMOVE_HEAD(head, elm, field) do { \
268 if (((head)->sqh_first = (elm)->field.sqe_next) == NULL) \
269 (head)->sqh_last = &(head)->sqh_first; \
270 } while (0)
271
272
273
274
275 #define TAILQ_HEAD(name, type) \
276 struct name { \
277 struct type *tqh_first; \
278 struct type **tqh_last; \
279 }
280
281 #define TAILQ_HEAD_INITIALIZER(head) \
282 { NULL, &(head).tqh_first }
283
284 #define TAILQ_ENTRY(type) \
285 struct { \
286 struct type *tqe_next; \
287 struct type **tqe_prev; \
288 }
289
290
291
292
293 #define TAILQ_FIRST(head) ((head)->tqh_first)
294 #define TAILQ_END(head) NULL
295 #define TAILQ_NEXT(elm, field) ((elm)->field.tqe_next)
296 #define TAILQ_LAST(head, headname) \
297 (*(((struct headname *)((head)->tqh_last))->tqh_last))
298
299 #define TAILQ_PREV(elm, headname, field) \
300 (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last))
301 #define TAILQ_EMPTY(head) \
302 (TAILQ_FIRST(head) == TAILQ_END(head))
303
304 #define TAILQ_FOREACH(var, head, field) \
305 for((var) = TAILQ_FIRST(head); \
306 (var) != TAILQ_END(head); \
307 (var) = TAILQ_NEXT(var, field))
308
309 #define TAILQ_FOREACH_REVERSE(var, head, headname, field) \
310 for((var) = TAILQ_LAST(head, headname); \
311 (var) != TAILQ_END(head); \
312 (var) = TAILQ_PREV(var, headname, field))
313
314
315
316
317 #define TAILQ_INIT(head) do { \
318 (head)->tqh_first = NULL; \
319 (head)->tqh_last = &(head)->tqh_first; \
320 } while (0)
321
322 #define TAILQ_INSERT_HEAD(head, elm, field) do { \
323 if (((elm)->field.tqe_next = (head)->tqh_first) != NULL) \
324 (head)->tqh_first->field.tqe_prev = \
325 &(elm)->field.tqe_next; \
326 else \
327 (head)->tqh_last = &(elm)->field.tqe_next; \
328 (head)->tqh_first = (elm); \
329 (elm)->field.tqe_prev = &(head)->tqh_first; \
330 } while (0)
331
332 #define TAILQ_INSERT_TAIL(head, elm, field) do { \
333 (elm)->field.tqe_next = NULL; \
334 (elm)->field.tqe_prev = (head)->tqh_last; \
335 *(head)->tqh_last = (elm); \
336 (head)->tqh_last = &(elm)->field.tqe_next; \
337 } while (0)
338
339 #define TAILQ_INSERT_AFTER(head, listelm, elm, field) do { \
340 if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != NULL)\
341 (elm)->field.tqe_next->field.tqe_prev = \
342 &(elm)->field.tqe_next; \
343 else \
344 (head)->tqh_last = &(elm)->field.tqe_next; \
345 (listelm)->field.tqe_next = (elm); \
346 (elm)->field.tqe_prev = &(listelm)->field.tqe_next; \
347 } while (0)
348
349 #define TAILQ_INSERT_BEFORE(listelm, elm, field) do { \
350 (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \
351 (elm)->field.tqe_next = (listelm); \
352 *(listelm)->field.tqe_prev = (elm); \
353 (listelm)->field.tqe_prev = &(elm)->field.tqe_next; \
354 } while (0)
355
356 #define TAILQ_REMOVE(head, elm, field) do { \
357 if (((elm)->field.tqe_next) != NULL) \
358 (elm)->field.tqe_next->field.tqe_prev = \
359 (elm)->field.tqe_prev; \
360 else \
361 (head)->tqh_last = (elm)->field.tqe_prev; \
362 *(elm)->field.tqe_prev = (elm)->field.tqe_next; \
363 } while (0)
364
365 #define TAILQ_REPLACE(head, elm, elm2, field) do { \
366 if (((elm2)->field.tqe_next = (elm)->field.tqe_next) != NULL) \
367 (elm2)->field.tqe_next->field.tqe_prev = \
368 &(elm2)->field.tqe_next; \
369 else \
370 (head)->tqh_last = &(elm2)->field.tqe_next; \
371 (elm2)->field.tqe_prev = (elm)->field.tqe_prev; \
372 *(elm2)->field.tqe_prev = (elm2); \
373 } while (0)
374
375
376
377
378 #define CIRCLEQ_HEAD(name, type) \
379 struct name { \
380 struct type *cqh_first; \
381 struct type *cqh_last; \
382 }
383
384 #define CIRCLEQ_HEAD_INITIALIZER(head) \
385 { CIRCLEQ_END(&head), CIRCLEQ_END(&head) }
386
387 #define CIRCLEQ_ENTRY(type) \
388 struct { \
389 struct type *cqe_next; \
390 struct type *cqe_prev; \
391 }
392
393
394
395
396 #define CIRCLEQ_FIRST(head) ((head)->cqh_first)
397 #define CIRCLEQ_LAST(head) ((head)->cqh_last)
398 #define CIRCLEQ_END(head) ((void *)(head))
399 #define CIRCLEQ_NEXT(elm, field) ((elm)->field.cqe_next)
400 #define CIRCLEQ_PREV(elm, field) ((elm)->field.cqe_prev)
401 #define CIRCLEQ_EMPTY(head) \
402 (CIRCLEQ_FIRST(head) == CIRCLEQ_END(head))
403
404 #define CIRCLEQ_FOREACH(var, head, field) \
405 for((var) = CIRCLEQ_FIRST(head); \
406 (var) != CIRCLEQ_END(head); \
407 (var) = CIRCLEQ_NEXT(var, field))
408
409 #define CIRCLEQ_FOREACH_REVERSE(var, head, field) \
410 for((var) = CIRCLEQ_LAST(head); \
411 (var) != CIRCLEQ_END(head); \
412 (var) = CIRCLEQ_PREV(var, field))
413
414
415
416
417 #define CIRCLEQ_INIT(head) do { \
418 (head)->cqh_first = CIRCLEQ_END(head); \
419 (head)->cqh_last = CIRCLEQ_END(head); \
420 } while (0)
421
422 #define CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) do { \
423 (elm)->field.cqe_next = (listelm)->field.cqe_next; \
424 (elm)->field.cqe_prev = (listelm); \
425 if ((listelm)->field.cqe_next == CIRCLEQ_END(head)) \
426 (head)->cqh_last = (elm); \
427 else \
428 (listelm)->field.cqe_next->field.cqe_prev = (elm); \
429 (listelm)->field.cqe_next = (elm); \
430 } while (0)
431
432 #define CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) do { \
433 (elm)->field.cqe_next = (listelm); \
434 (elm)->field.cqe_prev = (listelm)->field.cqe_prev; \
435 if ((listelm)->field.cqe_prev == CIRCLEQ_END(head)) \
436 (head)->cqh_first = (elm); \
437 else \
438 (listelm)->field.cqe_prev->field.cqe_next = (elm); \
439 (listelm)->field.cqe_prev = (elm); \
440 } while (0)
441
442 #define CIRCLEQ_INSERT_HEAD(head, elm, field) do { \
443 (elm)->field.cqe_next = (head)->cqh_first; \
444 (elm)->field.cqe_prev = CIRCLEQ_END(head); \
445 if ((head)->cqh_last == CIRCLEQ_END(head)) \
446 (head)->cqh_last = (elm); \
447 else \
448 (head)->cqh_first->field.cqe_prev = (elm); \
449 (head)->cqh_first = (elm); \
450 } while (0)
451
452 #define CIRCLEQ_INSERT_TAIL(head, elm, field) do { \
453 (elm)->field.cqe_next = CIRCLEQ_END(head); \
454 (elm)->field.cqe_prev = (head)->cqh_last; \
455 if ((head)->cqh_first == CIRCLEQ_END(head)) \
456 (head)->cqh_first = (elm); \
457 else \
458 (head)->cqh_last->field.cqe_next = (elm); \
459 (head)->cqh_last = (elm); \
460 } while (0)
461
462 #define CIRCLEQ_REMOVE(head, elm, field) do { \
463 if ((elm)->field.cqe_next == CIRCLEQ_END(head)) \
464 (head)->cqh_last = (elm)->field.cqe_prev; \
465 else \
466 (elm)->field.cqe_next->field.cqe_prev = \
467 (elm)->field.cqe_prev; \
468 if ((elm)->field.cqe_prev == CIRCLEQ_END(head)) \
469 (head)->cqh_first = (elm)->field.cqe_next; \
470 else \
471 (elm)->field.cqe_prev->field.cqe_next = \
472 (elm)->field.cqe_next; \
473 } while (0)
474
475 #define CIRCLEQ_REPLACE(head, elm, elm2, field) do { \
476 if (((elm2)->field.cqe_next = (elm)->field.cqe_next) == \
477 CIRCLEQ_END(head)) \
478 (head).cqh_last = (elm2); \
479 else \
480 (elm2)->field.cqe_next->field.cqe_prev = (elm2); \
481 if (((elm2)->field.cqe_prev = (elm)->field.cqe_prev) == \
482 CIRCLEQ_END(head)) \
483 (head).cqh_first = (elm2); \
484 else \
485 (elm2)->field.cqe_prev->field.cqe_next = (elm2); \
486 } while (0)
487
488 #endif