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