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