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