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