]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/l4re-core/uclibc/lib/contrib/uclibc/include/sys/queue.h
Update
[l4.git] / l4 / pkg / l4re-core / uclibc / lib / contrib / uclibc / include / sys / queue.h
1 /*
2  * Copyright (c) 1991, 1993
3  *      The Regents of the University of California.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. Neither the name of the University nor the names of its contributors
14  *    may be used to endorse or promote products derived from this software
15  *    without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  *
29  *      @(#)queue.h     8.5 (Berkeley) 8/20/94
30  */
31
32 #ifndef _SYS_QUEUE_H_
33 #define _SYS_QUEUE_H_
34
35 /*
36  * This file defines five types of data structures: singly-linked lists,
37  * lists, simple queues, tail queues, and circular queues.
38  *
39  * A singly-linked list is headed by a single forward pointer. The
40  * elements are singly linked for minimum space and pointer manipulation
41  * overhead at the expense of O(n) removal for arbitrary elements. New
42  * elements can be added to the list after an existing element or at the
43  * head of the list.  Elements being removed from the head of the list
44  * should use the explicit macro for this purpose for optimum
45  * efficiency. A singly-linked list may only be traversed in the forward
46  * direction.  Singly-linked lists are ideal for applications with large
47  * datasets and few or no removals or for implementing a LIFO queue.
48  *
49  * A list is headed by a single forward pointer (or an array of forward
50  * pointers for a hash table header). The elements are doubly linked
51  * so that an arbitrary element can be removed without a need to
52  * traverse the list. New elements can be added to the list before
53  * or after an existing element or at the head of the list. A list
54  * may only be traversed in the forward direction.
55  *
56  * A simple queue is headed by a pair of pointers, one the head of the
57  * list and the other to the tail of the list. The elements are singly
58  * linked to save space, so elements can only be removed from the
59  * head of the list. New elements can be added to the list after
60  * an existing element, at the head of the list, or at the end of the
61  * list. A simple queue may only be traversed in the forward direction.
62  *
63  * A tail queue is headed by a pair of pointers, one to the head of the
64  * list and the other to the tail of the list. The elements are doubly
65  * linked so that an arbitrary element can be removed without a need to
66  * traverse the list. New elements can be added to the list before or
67  * after an existing element, at the head of the list, or at the end of
68  * the list. A tail queue may be traversed in either direction.
69  *
70  * A circle queue is headed by a pair of pointers, one to the head of the
71  * list and the other to the tail of the list. The elements are doubly
72  * linked so that an arbitrary element can be removed without a need to
73  * traverse the list. New elements can be added to the list before or after
74  * an existing element, at the head of the list, or at the end of the list.
75  * A circle queue may be traversed in either direction, but has a more
76  * complex end of list detection.
77  *
78  * For details on the use of these macros, see the queue(3) manual page.
79  */
80
81 /*
82  * List definitions.
83  */
84 #define LIST_HEAD(name, type)                                           \
85 struct name {                                                           \
86         struct type *lh_first;  /* first element */                     \
87 }
88
89 #define LIST_HEAD_INITIALIZER(head)                                     \
90         { NULL }
91
92 #define LIST_ENTRY(type)                                                \
93 struct {                                                                \
94         struct type *le_next;   /* next element */                      \
95         struct type **le_prev;  /* address of previous next element */  \
96 }
97
98 /*
99  * List functions.
100  */
101 #define LIST_INIT(head) do {                                            \
102         (head)->lh_first = NULL;                                        \
103 } while (/*CONSTCOND*/0)
104
105 #define LIST_INSERT_AFTER(listelm, elm, field) do {                     \
106         if (((elm)->field.le_next = (listelm)->field.le_next) != NULL)  \
107                 (listelm)->field.le_next->field.le_prev =               \
108                     &(elm)->field.le_next;                              \
109         (listelm)->field.le_next = (elm);                               \
110         (elm)->field.le_prev = &(listelm)->field.le_next;               \
111 } while (/*CONSTCOND*/0)
112
113 #define LIST_INSERT_BEFORE(listelm, elm, field) do {                    \
114         (elm)->field.le_prev = (listelm)->field.le_prev;                \
115         (elm)->field.le_next = (listelm);                               \
116         *(listelm)->field.le_prev = (elm);                              \
117         (listelm)->field.le_prev = &(elm)->field.le_next;               \
118 } while (/*CONSTCOND*/0)
119
120 #define LIST_INSERT_HEAD(head, elm, field) do {                         \
121         if (((elm)->field.le_next = (head)->lh_first) != NULL)          \
122                 (head)->lh_first->field.le_prev = &(elm)->field.le_next;\
123         (head)->lh_first = (elm);                                       \
124         (elm)->field.le_prev = &(head)->lh_first;                       \
125 } while (/*CONSTCOND*/0)
126
127 #define LIST_REMOVE(elm, field) do {                                    \
128         if ((elm)->field.le_next != NULL)                               \
129                 (elm)->field.le_next->field.le_prev =                   \
130                     (elm)->field.le_prev;                               \
131         *(elm)->field.le_prev = (elm)->field.le_next;                   \
132 } while (/*CONSTCOND*/0)
133
134 #define LIST_FOREACH(var, head, field)                                  \
135         for ((var) = ((head)->lh_first);                                \
136                 (var);                                                  \
137                 (var) = ((var)->field.le_next))
138
139 /*
140  * List access methods.
141  */
142 #define LIST_EMPTY(head)                ((head)->lh_first == NULL)
143 #define LIST_FIRST(head)                ((head)->lh_first)
144 #define LIST_NEXT(elm, field)           ((elm)->field.le_next)
145
146
147 /*
148  * Singly-linked List definitions.
149  */
150 #define SLIST_HEAD(name, type)                                          \
151 struct name {                                                           \
152         struct type *slh_first; /* first element */                     \
153 }
154
155 #define SLIST_HEAD_INITIALIZER(head)                                    \
156         { NULL }
157
158 #define SLIST_ENTRY(type)                                               \
159 struct {                                                                \
160         struct type *sle_next;  /* next element */                      \
161 }
162
163 /*
164  * Singly-linked List functions.
165  */
166 #define SLIST_INIT(head) do {                                           \
167         (head)->slh_first = NULL;                                       \
168 } while (/*CONSTCOND*/0)
169
170 #define SLIST_INSERT_AFTER(slistelm, elm, field) do {                   \
171         (elm)->field.sle_next = (slistelm)->field.sle_next;             \
172         (slistelm)->field.sle_next = (elm);                             \
173 } while (/*CONSTCOND*/0)
174
175 #define SLIST_INSERT_HEAD(head, elm, field) do {                        \
176         (elm)->field.sle_next = (head)->slh_first;                      \
177         (head)->slh_first = (elm);                                      \
178 } while (/*CONSTCOND*/0)
179
180 #define SLIST_REMOVE_HEAD(head, field) do {                             \
181         (head)->slh_first = (head)->slh_first->field.sle_next;          \
182 } while (/*CONSTCOND*/0)
183
184 #define SLIST_REMOVE(head, elm, type, field) do {                       \
185         if ((head)->slh_first == (elm)) {                               \
186                 SLIST_REMOVE_HEAD((head), field);                       \
187         }                                                               \
188         else {                                                          \
189                 struct type *curelm = (head)->slh_first;                \
190                 while(curelm->field.sle_next != (elm))                  \
191                         curelm = curelm->field.sle_next;                \
192                 curelm->field.sle_next =                                \
193                     curelm->field.sle_next->field.sle_next;             \
194         }                                                               \
195 } while (/*CONSTCOND*/0)
196
197 #define SLIST_FOREACH(var, head, field)                                 \
198         for((var) = (head)->slh_first; (var); (var) = (var)->field.sle_next)
199
200 /*
201  * Singly-linked List access methods.
202  */
203 #define SLIST_EMPTY(head)       ((head)->slh_first == NULL)
204 #define SLIST_FIRST(head)       ((head)->slh_first)
205 #define SLIST_NEXT(elm, field)  ((elm)->field.sle_next)
206
207
208 /*
209  * Singly-linked Tail queue declarations.
210  */
211 #define STAILQ_HEAD(name, type)                                 \
212 struct name {                                                           \
213         struct type *stqh_first;        /* first element */                     \
214         struct type **stqh_last;        /* addr of last next element */         \
215 }
216
217 #define STAILQ_HEAD_INITIALIZER(head)                                   \
218         { NULL, &(head).stqh_first }
219
220 #define STAILQ_ENTRY(type)                                              \
221 struct {                                                                \
222         struct type *stqe_next; /* next element */                      \
223 }
224
225 /*
226  * Singly-linked Tail queue functions.
227  */
228 #define STAILQ_INIT(head) do {                                          \
229         (head)->stqh_first = NULL;                                      \
230         (head)->stqh_last = &(head)->stqh_first;                                \
231 } while (/*CONSTCOND*/0)
232
233 #define STAILQ_INSERT_HEAD(head, elm, field) do {                       \
234         if (((elm)->field.stqe_next = (head)->stqh_first) == NULL)      \
235                 (head)->stqh_last = &(elm)->field.stqe_next;            \
236         (head)->stqh_first = (elm);                                     \
237 } while (/*CONSTCOND*/0)
238
239 #define STAILQ_INSERT_TAIL(head, elm, field) do {                       \
240         (elm)->field.stqe_next = NULL;                                  \
241         *(head)->stqh_last = (elm);                                     \
242         (head)->stqh_last = &(elm)->field.stqe_next;                    \
243 } while (/*CONSTCOND*/0)
244
245 #define STAILQ_INSERT_AFTER(head, listelm, elm, field) do {             \
246         if (((elm)->field.stqe_next = (listelm)->field.stqe_next) == NULL)\
247                 (head)->stqh_last = &(elm)->field.stqe_next;            \
248         (listelm)->field.stqe_next = (elm);                             \
249 } while (/*CONSTCOND*/0)
250
251 #define STAILQ_REMOVE_HEAD(head, field) do {                            \
252         if (((head)->stqh_first = (head)->stqh_first->field.stqe_next) == NULL) \
253                 (head)->stqh_last = &(head)->stqh_first;                        \
254 } while (/*CONSTCOND*/0)
255
256 #define STAILQ_REMOVE(head, elm, type, field) do {                      \
257         if ((head)->stqh_first == (elm)) {                              \
258                 STAILQ_REMOVE_HEAD((head), field);                      \
259         } else {                                                        \
260                 struct type *curelm = (head)->stqh_first;               \
261                 while (curelm->field.stqe_next != (elm))                        \
262                         curelm = curelm->field.stqe_next;               \
263                 if ((curelm->field.stqe_next =                          \
264                         curelm->field.stqe_next->field.stqe_next) == NULL) \
265                             (head)->stqh_last = &(curelm)->field.stqe_next; \
266         }                                                               \
267 } while (/*CONSTCOND*/0)
268
269 #define STAILQ_FOREACH(var, head, field)                                \
270         for ((var) = ((head)->stqh_first);                              \
271                 (var);                                                  \
272                 (var) = ((var)->field.stqe_next))
273
274 #define STAILQ_CONCAT(head1, head2) do {                                \
275         if (!STAILQ_EMPTY((head2))) {                                   \
276                 *(head1)->stqh_last = (head2)->stqh_first;              \
277                 (head1)->stqh_last = (head2)->stqh_last;                \
278                 STAILQ_INIT((head2));                                   \
279         }                                                               \
280 } while (/*CONSTCOND*/0)
281
282 /*
283  * Singly-linked Tail queue access methods.
284  */
285 #define STAILQ_EMPTY(head)      ((head)->stqh_first == NULL)
286 #define STAILQ_FIRST(head)      ((head)->stqh_first)
287 #define STAILQ_NEXT(elm, field) ((elm)->field.stqe_next)
288
289
290 /*
291  * Simple queue definitions.
292  */
293 #define SIMPLEQ_HEAD(name, type)                                        \
294 struct name {                                                           \
295         struct type *sqh_first; /* first element */                     \
296         struct type **sqh_last; /* addr of last next element */         \
297 }
298
299 #define SIMPLEQ_HEAD_INITIALIZER(head)                                  \
300         { NULL, &(head).sqh_first }
301
302 #define SIMPLEQ_ENTRY(type)                                             \
303 struct {                                                                \
304         struct type *sqe_next;  /* next element */                      \
305 }
306
307 /*
308  * Simple queue functions.
309  */
310 #define SIMPLEQ_INIT(head) do {                                         \
311         (head)->sqh_first = NULL;                                       \
312         (head)->sqh_last = &(head)->sqh_first;                          \
313 } while (/*CONSTCOND*/0)
314
315 #define SIMPLEQ_INSERT_HEAD(head, elm, field) do {                      \
316         if (((elm)->field.sqe_next = (head)->sqh_first) == NULL)        \
317                 (head)->sqh_last = &(elm)->field.sqe_next;              \
318         (head)->sqh_first = (elm);                                      \
319 } while (/*CONSTCOND*/0)
320
321 #define SIMPLEQ_INSERT_TAIL(head, elm, field) do {                      \
322         (elm)->field.sqe_next = NULL;                                   \
323         *(head)->sqh_last = (elm);                                      \
324         (head)->sqh_last = &(elm)->field.sqe_next;                      \
325 } while (/*CONSTCOND*/0)
326
327 #define SIMPLEQ_INSERT_AFTER(head, listelm, elm, field) do {            \
328         if (((elm)->field.sqe_next = (listelm)->field.sqe_next) == NULL)\
329                 (head)->sqh_last = &(elm)->field.sqe_next;              \
330         (listelm)->field.sqe_next = (elm);                              \
331 } while (/*CONSTCOND*/0)
332
333 #define SIMPLEQ_REMOVE_HEAD(head, field) do {                           \
334         if (((head)->sqh_first = (head)->sqh_first->field.sqe_next) == NULL) \
335                 (head)->sqh_last = &(head)->sqh_first;                  \
336 } while (/*CONSTCOND*/0)
337
338 #define SIMPLEQ_REMOVE(head, elm, type, field) do {                     \
339         if ((head)->sqh_first == (elm)) {                               \
340                 SIMPLEQ_REMOVE_HEAD((head), field);                     \
341         } else {                                                        \
342                 struct type *curelm = (head)->sqh_first;                \
343                 while (curelm->field.sqe_next != (elm))                 \
344                         curelm = curelm->field.sqe_next;                \
345                 if ((curelm->field.sqe_next =                           \
346                         curelm->field.sqe_next->field.sqe_next) == NULL) \
347                             (head)->sqh_last = &(curelm)->field.sqe_next; \
348         }                                                               \
349 } while (/*CONSTCOND*/0)
350
351 #define SIMPLEQ_FOREACH(var, head, field)                               \
352         for ((var) = ((head)->sqh_first);                               \
353                 (var);                                                  \
354                 (var) = ((var)->field.sqe_next))
355
356 /*
357  * Simple queue access methods.
358  */
359 #define SIMPLEQ_EMPTY(head)             ((head)->sqh_first == NULL)
360 #define SIMPLEQ_FIRST(head)             ((head)->sqh_first)
361 #define SIMPLEQ_NEXT(elm, field)        ((elm)->field.sqe_next)
362
363
364 /*
365  * Tail queue definitions.
366  */
367 #define _TAILQ_HEAD(name, type, qual)                                   \
368 struct name {                                                           \
369         qual type *tqh_first;           /* first element */             \
370         qual type *qual *tqh_last;      /* addr of last next element */ \
371 }
372 #define TAILQ_HEAD(name, type)  _TAILQ_HEAD(name, struct type,)
373
374 #define TAILQ_HEAD_INITIALIZER(head)                                    \
375         { NULL, &(head).tqh_first }
376
377 #define _TAILQ_ENTRY(type, qual)                                        \
378 struct {                                                                \
379         qual type *tqe_next;            /* next element */              \
380         qual type *qual *tqe_prev;      /* address of previous next element */\
381 }
382 #define TAILQ_ENTRY(type)       _TAILQ_ENTRY(struct type,)
383
384 /*
385  * Tail queue functions.
386  */
387 #define TAILQ_INIT(head) do {                                           \
388         (head)->tqh_first = NULL;                                       \
389         (head)->tqh_last = &(head)->tqh_first;                          \
390 } while (/*CONSTCOND*/0)
391
392 #define TAILQ_INSERT_HEAD(head, elm, field) do {                        \
393         if (((elm)->field.tqe_next = (head)->tqh_first) != NULL)        \
394                 (head)->tqh_first->field.tqe_prev =                     \
395                     &(elm)->field.tqe_next;                             \
396         else                                                            \
397                 (head)->tqh_last = &(elm)->field.tqe_next;              \
398         (head)->tqh_first = (elm);                                      \
399         (elm)->field.tqe_prev = &(head)->tqh_first;                     \
400 } while (/*CONSTCOND*/0)
401
402 #define TAILQ_INSERT_TAIL(head, elm, field) do {                        \
403         (elm)->field.tqe_next = NULL;                                   \
404         (elm)->field.tqe_prev = (head)->tqh_last;                       \
405         *(head)->tqh_last = (elm);                                      \
406         (head)->tqh_last = &(elm)->field.tqe_next;                      \
407 } while (/*CONSTCOND*/0)
408
409 #define TAILQ_INSERT_AFTER(head, listelm, elm, field) do {              \
410         if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != NULL)\
411                 (elm)->field.tqe_next->field.tqe_prev =                 \
412                     &(elm)->field.tqe_next;                             \
413         else                                                            \
414                 (head)->tqh_last = &(elm)->field.tqe_next;              \
415         (listelm)->field.tqe_next = (elm);                              \
416         (elm)->field.tqe_prev = &(listelm)->field.tqe_next;             \
417 } while (/*CONSTCOND*/0)
418
419 #define TAILQ_INSERT_BEFORE(listelm, elm, field) do {                   \
420         (elm)->field.tqe_prev = (listelm)->field.tqe_prev;              \
421         (elm)->field.tqe_next = (listelm);                              \
422         *(listelm)->field.tqe_prev = (elm);                             \
423         (listelm)->field.tqe_prev = &(elm)->field.tqe_next;             \
424 } while (/*CONSTCOND*/0)
425
426 #define TAILQ_REMOVE(head, elm, field) do {                             \
427         if (((elm)->field.tqe_next) != NULL)                            \
428                 (elm)->field.tqe_next->field.tqe_prev =                 \
429                     (elm)->field.tqe_prev;                              \
430         else                                                            \
431                 (head)->tqh_last = (elm)->field.tqe_prev;               \
432         *(elm)->field.tqe_prev = (elm)->field.tqe_next;                 \
433 } while (/*CONSTCOND*/0)
434
435 #define TAILQ_FOREACH(var, head, field)                                 \
436         for ((var) = ((head)->tqh_first);                               \
437                 (var);                                                  \
438                 (var) = ((var)->field.tqe_next))
439
440 #define TAILQ_FOREACH_REVERSE(var, head, headname, field)               \
441         for ((var) = (*(((struct headname *)((head)->tqh_last))->tqh_last));    \
442                 (var);                                                  \
443                 (var) = (*(((struct headname *)((var)->field.tqe_prev))->tqh_last)))
444
445 #define TAILQ_CONCAT(head1, head2, field) do {                          \
446         if (!TAILQ_EMPTY(head2)) {                                      \
447                 *(head1)->tqh_last = (head2)->tqh_first;                \
448                 (head2)->tqh_first->field.tqe_prev = (head1)->tqh_last; \
449                 (head1)->tqh_last = (head2)->tqh_last;                  \
450                 TAILQ_INIT((head2));                                    \
451         }                                                               \
452 } while (/*CONSTCOND*/0)
453
454 /*
455  * Tail queue access methods.
456  */
457 #define TAILQ_EMPTY(head)               ((head)->tqh_first == NULL)
458 #define TAILQ_FIRST(head)               ((head)->tqh_first)
459 #define TAILQ_NEXT(elm, field)          ((elm)->field.tqe_next)
460
461 #define TAILQ_LAST(head, headname) \
462         (*(((struct headname *)((head)->tqh_last))->tqh_last))
463 #define TAILQ_PREV(elm, headname, field) \
464         (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last))
465
466
467 /*
468  * Circular queue definitions.
469  */
470 #define CIRCLEQ_HEAD(name, type)                                        \
471 struct name {                                                           \
472         struct type *cqh_first;         /* first element */             \
473         struct type *cqh_last;          /* last element */              \
474 }
475
476 #define CIRCLEQ_HEAD_INITIALIZER(head)                                  \
477         { (void *)&head, (void *)&head }
478
479 #define CIRCLEQ_ENTRY(type)                                             \
480 struct {                                                                \
481         struct type *cqe_next;          /* next element */              \
482         struct type *cqe_prev;          /* previous element */          \
483 }
484
485 /*
486  * Circular queue functions.
487  */
488 #define CIRCLEQ_INIT(head) do {                                         \
489         (head)->cqh_first = (void *)(head);                             \
490         (head)->cqh_last = (void *)(head);                              \
491 } while (/*CONSTCOND*/0)
492
493 #define CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) do {            \
494         (elm)->field.cqe_next = (listelm)->field.cqe_next;              \
495         (elm)->field.cqe_prev = (listelm);                              \
496         if ((listelm)->field.cqe_next == (void *)(head))                \
497                 (head)->cqh_last = (elm);                               \
498         else                                                            \
499                 (listelm)->field.cqe_next->field.cqe_prev = (elm);      \
500         (listelm)->field.cqe_next = (elm);                              \
501 } while (/*CONSTCOND*/0)
502
503 #define CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) do {           \
504         (elm)->field.cqe_next = (listelm);                              \
505         (elm)->field.cqe_prev = (listelm)->field.cqe_prev;              \
506         if ((listelm)->field.cqe_prev == (void *)(head))                \
507                 (head)->cqh_first = (elm);                              \
508         else                                                            \
509                 (listelm)->field.cqe_prev->field.cqe_next = (elm);      \
510         (listelm)->field.cqe_prev = (elm);                              \
511 } while (/*CONSTCOND*/0)
512
513 #define CIRCLEQ_INSERT_HEAD(head, elm, field) do {                      \
514         (elm)->field.cqe_next = (head)->cqh_first;                      \
515         (elm)->field.cqe_prev = (void *)(head);                         \
516         if ((head)->cqh_last == (void *)(head))                         \
517                 (head)->cqh_last = (elm);                               \
518         else                                                            \
519                 (head)->cqh_first->field.cqe_prev = (elm);              \
520         (head)->cqh_first = (elm);                                      \
521 } while (/*CONSTCOND*/0)
522
523 #define CIRCLEQ_INSERT_TAIL(head, elm, field) do {                      \
524         (elm)->field.cqe_next = (void *)(head);                         \
525         (elm)->field.cqe_prev = (head)->cqh_last;                       \
526         if ((head)->cqh_first == (void *)(head))                        \
527                 (head)->cqh_first = (elm);                              \
528         else                                                            \
529                 (head)->cqh_last->field.cqe_next = (elm);               \
530         (head)->cqh_last = (elm);                                       \
531 } while (/*CONSTCOND*/0)
532
533 #define CIRCLEQ_REMOVE(head, elm, field) do {                           \
534         if ((elm)->field.cqe_next == (void *)(head))                    \
535                 (head)->cqh_last = (elm)->field.cqe_prev;               \
536         else                                                            \
537                 (elm)->field.cqe_next->field.cqe_prev =                 \
538                     (elm)->field.cqe_prev;                              \
539         if ((elm)->field.cqe_prev == (void *)(head))                    \
540                 (head)->cqh_first = (elm)->field.cqe_next;              \
541         else                                                            \
542                 (elm)->field.cqe_prev->field.cqe_next =                 \
543                     (elm)->field.cqe_next;                              \
544 } while (/*CONSTCOND*/0)
545
546 #define CIRCLEQ_FOREACH(var, head, field)                               \
547         for ((var) = ((head)->cqh_first);                               \
548                 (var) != (const void *)(head);                          \
549                 (var) = ((var)->field.cqe_next))
550
551 #define CIRCLEQ_FOREACH_REVERSE(var, head, field)                       \
552         for ((var) = ((head)->cqh_last);                                \
553                 (var) != (const void *)(head);                          \
554                 (var) = ((var)->field.cqe_prev))
555
556 /*
557  * Circular queue access methods.
558  */
559 #define CIRCLEQ_EMPTY(head)             ((head)->cqh_first == (void *)(head))
560 #define CIRCLEQ_FIRST(head)             ((head)->cqh_first)
561 #define CIRCLEQ_LAST(head)              ((head)->cqh_last)
562 #define CIRCLEQ_NEXT(elm, field)        ((elm)->field.cqe_next)
563 #define CIRCLEQ_PREV(elm, field)        ((elm)->field.cqe_prev)
564
565 #define CIRCLEQ_LOOP_NEXT(head, elm, field)                             \
566         (((elm)->field.cqe_next == (void *)(head))                      \
567             ? ((head)->cqh_first)                                       \
568             : (elm->field.cqe_next))
569 #define CIRCLEQ_LOOP_PREV(head, elm, field)                             \
570         (((elm)->field.cqe_prev == (void *)(head))                      \
571             ? ((head)->cqh_last)                                        \
572             : (elm->field.cqe_prev))
573
574 #endif  /* sys/queue.h */