15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*	$OpenBSD: queue.h,v 1.16 2000/09/07 19:47:59 art Exp $	*/
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*	$NetBSD: queue.h,v 1.11 1996/05/16 05:17:14 mycroft Exp $	*/
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (c) 1991, 1993
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *	The Regents of the University of California.  All rights reserved.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Redistribution and use in source and binary forms, with or without
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * modification, are permitted provided that the following conditions
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * are met:
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1. Redistributions of source code must retain the above copyright
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    notice, this list of conditions and the following disclaimer.
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    notice, this list of conditions and the following disclaimer in the
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    documentation and/or other materials provided with the distribution.
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3. Neither the name of the University nor the names of its contributors
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    may be used to endorse or promote products derived from this software
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    without specific prior written permission.
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * SUCH DAMAGE.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *	@(#)queue.h	8.5 (Berkeley) 8/20/94
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef	_SYS_QUEUE_H_
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define	_SYS_QUEUE_H_
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This file defines five types of data structures: singly-linked lists,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * lists, simple queues, tail queues, and circular queues.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * A singly-linked list is headed by a single forward pointer. The elements
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * are singly linked for minimum space and pointer manipulation overhead at
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the expense of O(n) removal for arbitrary elements. New elements can be
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * added to the list after an existing element or at the head of the list.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Elements being removed from the head of the list should use the explicit
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * macro for this purpose for optimum efficiency. A singly-linked list may
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * only be traversed in the forward direction.  Singly-linked lists are ideal
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * for applications with large datasets and few or no removals or for
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * implementing a LIFO queue.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * A list is headed by a single forward pointer (or an array of forward
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * pointers for a hash table header). The elements are doubly linked
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * so that an arbitrary element can be removed without a need to
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * traverse the list. New elements can be added to the list before
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * or after an existing element or at the head of the list. A list
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * may only be traversed in the forward direction.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * A simple queue is headed by a pair of pointers, one the head of the
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * list and the other to the tail of the list. The elements are singly
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * linked to save space, so elements can only be removed from the
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * head of the list. New elements can be added to the list before or after
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * an existing element, at the head of the list, or at the end of the
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * list. A simple queue may only be traversed in the forward direction.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * A tail queue is headed by a pair of pointers, one to the head of the
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * list and the other to the tail of the list. The elements are doubly
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * linked so that an arbitrary element can be removed without a need to
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * traverse the list. New elements can be added to the list before or
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * after an existing element, at the head of the list, or at the end of
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the list. A tail queue may be traversed in either direction.
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * A circle queue is headed by a pair of pointers, one to the head of the
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * list and the other to the tail of the list. The elements are doubly
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * linked so that an arbitrary element can be removed without a need to
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * traverse the list. New elements can be added to the list before or after
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * an existing element, at the head of the list, or at the end of the list.
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * A circle queue may be traversed in either direction, but has a more
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * complex end of list detection.
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * For details on the use of these macros, see the queue(3) manual page.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Singly-linked List definitions.
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SLIST_HEAD(name, type)						\
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct name {								\
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	struct type *slh_first;	/* first element */			\
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define	SLIST_HEAD_INITIALIZER(head)					\
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{ NULL }
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef WIN32
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SLIST_ENTRY(type)						\
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct {								\
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	struct type *sle_next;	/* next element */			\
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Singly-linked List access methods.
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define	SLIST_FIRST(head)	((head)->slh_first)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define	SLIST_END(head)		NULL
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define	SLIST_EMPTY(head)	(SLIST_FIRST(head) == SLIST_END(head))
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define	SLIST_NEXT(elm, field)	((elm)->field.sle_next)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define	SLIST_FOREACH(var, head, field)					\
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for((var) = SLIST_FIRST(head);					\
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (var) != SLIST_END(head);					\
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (var) = SLIST_NEXT(var, field))
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Singly-linked List functions.
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define	SLIST_INIT(head) {						\
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	SLIST_FIRST(head) = SLIST_END(head);				\
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define	SLIST_INSERT_AFTER(slistelm, elm, field) do {			\
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(elm)->field.sle_next = (slistelm)->field.sle_next;		\
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(slistelm)->field.sle_next = (elm);				\
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} while (0)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define	SLIST_INSERT_HEAD(head, elm, field) do {			\
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(elm)->field.sle_next = (head)->slh_first;			\
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(head)->slh_first = (elm);					\
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} while (0)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define	SLIST_REMOVE_HEAD(head, field) do {				\
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(head)->slh_first = (head)->slh_first->field.sle_next;		\
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} while (0)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * List definitions.
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LIST_HEAD(name, type)						\
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct name {								\
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	struct type *lh_first;	/* first element */			\
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LIST_HEAD_INITIALIZER(head)					\
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{ NULL }
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LIST_ENTRY(type)						\
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct {								\
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	struct type *le_next;	/* next element */			\
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	struct type **le_prev;	/* address of previous next element */	\
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * List access methods
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define	LIST_FIRST(head)		((head)->lh_first)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define	LIST_END(head)			NULL
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define	LIST_EMPTY(head)		(LIST_FIRST(head) == LIST_END(head))
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define	LIST_NEXT(elm, field)		((elm)->field.le_next)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LIST_FOREACH(var, head, field)					\
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for((var) = LIST_FIRST(head);					\
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (var)!= LIST_END(head);					\
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (var) = LIST_NEXT(var, field))
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * List functions.
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define	LIST_INIT(head) do {						\
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	LIST_FIRST(head) = LIST_END(head);				\
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} while (0)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LIST_INSERT_AFTER(listelm, elm, field) do {			\
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (((elm)->field.le_next = (listelm)->field.le_next) != NULL)	\
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(listelm)->field.le_next->field.le_prev =		\
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    &(elm)->field.le_next;				\
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(listelm)->field.le_next = (elm);				\
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(elm)->field.le_prev = &(listelm)->field.le_next;		\
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} while (0)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define	LIST_INSERT_BEFORE(listelm, elm, field) do {			\
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(elm)->field.le_prev = (listelm)->field.le_prev;		\
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(elm)->field.le_next = (listelm);				\
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*(listelm)->field.le_prev = (elm);				\
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(listelm)->field.le_prev = &(elm)->field.le_next;		\
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} while (0)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LIST_INSERT_HEAD(head, elm, field) do {				\
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (((elm)->field.le_next = (head)->lh_first) != NULL)		\
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(head)->lh_first->field.le_prev = &(elm)->field.le_next;\
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(head)->lh_first = (elm);					\
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(elm)->field.le_prev = &(head)->lh_first;			\
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} while (0)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LIST_REMOVE(elm, field) do {					\
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((elm)->field.le_next != NULL)				\
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(elm)->field.le_next->field.le_prev =			\
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (elm)->field.le_prev;				\
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*(elm)->field.le_prev = (elm)->field.le_next;			\
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} while (0)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LIST_REPLACE(elm, elm2, field) do {				\
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (((elm2)->field.le_next = (elm)->field.le_next) != NULL)	\
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(elm2)->field.le_next->field.le_prev =			\
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    &(elm2)->field.le_next;				\
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(elm2)->field.le_prev = (elm)->field.le_prev;			\
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*(elm2)->field.le_prev = (elm2);				\
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} while (0)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Simple queue definitions.
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SIMPLEQ_HEAD(name, type)					\
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct name {								\
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	struct type *sqh_first;	/* first element */			\
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	struct type **sqh_last;	/* addr of last next element */		\
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SIMPLEQ_HEAD_INITIALIZER(head)					\
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{ NULL, &(head).sqh_first }
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SIMPLEQ_ENTRY(type)						\
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct {								\
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	struct type *sqe_next;	/* next element */			\
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Simple queue access methods.
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define	SIMPLEQ_FIRST(head)	    ((head)->sqh_first)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define	SIMPLEQ_END(head)	    NULL
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define	SIMPLEQ_EMPTY(head)	    (SIMPLEQ_FIRST(head) == SIMPLEQ_END(head))
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define	SIMPLEQ_NEXT(elm, field)    ((elm)->field.sqe_next)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SIMPLEQ_FOREACH(var, head, field)				\
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for((var) = SIMPLEQ_FIRST(head);				\
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (var) != SIMPLEQ_END(head);					\
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (var) = SIMPLEQ_NEXT(var, field))
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Simple queue functions.
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define	SIMPLEQ_INIT(head) do {						\
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(head)->sqh_first = NULL;					\
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(head)->sqh_last = &(head)->sqh_first;				\
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} while (0)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SIMPLEQ_INSERT_HEAD(head, elm, field) do {			\
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (((elm)->field.sqe_next = (head)->sqh_first) == NULL)	\
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(head)->sqh_last = &(elm)->field.sqe_next;		\
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(head)->sqh_first = (elm);					\
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} while (0)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SIMPLEQ_INSERT_TAIL(head, elm, field) do {			\
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(elm)->field.sqe_next = NULL;					\
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*(head)->sqh_last = (elm);					\
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(head)->sqh_last = &(elm)->field.sqe_next;			\
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} while (0)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SIMPLEQ_INSERT_AFTER(head, listelm, elm, field) do {		\
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (((elm)->field.sqe_next = (listelm)->field.sqe_next) == NULL)\
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(head)->sqh_last = &(elm)->field.sqe_next;		\
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(listelm)->field.sqe_next = (elm);				\
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} while (0)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SIMPLEQ_REMOVE_HEAD(head, elm, field) do {			\
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (((head)->sqh_first = (elm)->field.sqe_next) == NULL)	\
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(head)->sqh_last = &(head)->sqh_first;			\
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} while (0)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Tail queue definitions.
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define TAILQ_HEAD(name, type)						\
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct name {								\
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	struct type *tqh_first;	/* first element */			\
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	struct type **tqh_last;	/* addr of last next element */		\
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define TAILQ_HEAD_INITIALIZER(head)					\
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{ NULL, &(head).tqh_first }
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define TAILQ_ENTRY(type)						\
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct {								\
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	struct type *tqe_next;	/* next element */			\
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	struct type **tqe_prev;	/* address of previous next element */	\
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * tail queue access methods
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define	TAILQ_FIRST(head)		((head)->tqh_first)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define	TAILQ_END(head)			NULL
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define	TAILQ_NEXT(elm, field)		((elm)->field.tqe_next)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define TAILQ_LAST(head, headname)					\
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(*(((struct headname *)((head)->tqh_last))->tqh_last))
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* XXX */
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define TAILQ_PREV(elm, headname, field)				\
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(*(((struct headname *)((elm)->field.tqe_prev))->tqh_last))
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define	TAILQ_EMPTY(head)						\
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(TAILQ_FIRST(head) == TAILQ_END(head))
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define TAILQ_FOREACH(var, head, field)					\
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for((var) = TAILQ_FIRST(head);					\
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (var) != TAILQ_END(head);					\
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (var) = TAILQ_NEXT(var, field))
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define TAILQ_FOREACH_REVERSE(var, head, field, headname)		\
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for((var) = TAILQ_LAST(head, headname);				\
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (var) != TAILQ_END(head);					\
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (var) = TAILQ_PREV(var, headname, field))
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Tail queue functions.
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define	TAILQ_INIT(head) do {						\
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(head)->tqh_first = NULL;					\
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(head)->tqh_last = &(head)->tqh_first;				\
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} while (0)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define TAILQ_INSERT_HEAD(head, elm, field) do {			\
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (((elm)->field.tqe_next = (head)->tqh_first) != NULL)	\
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(head)->tqh_first->field.tqe_prev =			\
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    &(elm)->field.tqe_next;				\
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else								\
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(head)->tqh_last = &(elm)->field.tqe_next;		\
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(head)->tqh_first = (elm);					\
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(elm)->field.tqe_prev = &(head)->tqh_first;			\
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} while (0)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define TAILQ_INSERT_TAIL(head, elm, field) do {			\
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(elm)->field.tqe_next = NULL;					\
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(elm)->field.tqe_prev = (head)->tqh_last;			\
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*(head)->tqh_last = (elm);					\
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(head)->tqh_last = &(elm)->field.tqe_next;			\
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} while (0)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define TAILQ_INSERT_AFTER(head, listelm, elm, field) do {		\
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != NULL)\
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(elm)->field.tqe_next->field.tqe_prev =			\
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    &(elm)->field.tqe_next;				\
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else								\
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(head)->tqh_last = &(elm)->field.tqe_next;		\
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(listelm)->field.tqe_next = (elm);				\
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(elm)->field.tqe_prev = &(listelm)->field.tqe_next;		\
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} while (0)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define	TAILQ_INSERT_BEFORE(listelm, elm, field) do {			\
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(elm)->field.tqe_prev = (listelm)->field.tqe_prev;		\
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(elm)->field.tqe_next = (listelm);				\
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*(listelm)->field.tqe_prev = (elm);				\
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(listelm)->field.tqe_prev = &(elm)->field.tqe_next;		\
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} while (0)
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define TAILQ_REMOVE(head, elm, field) do {				\
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (((elm)->field.tqe_next) != NULL)				\
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(elm)->field.tqe_next->field.tqe_prev =			\
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (elm)->field.tqe_prev;				\
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else								\
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(head)->tqh_last = (elm)->field.tqe_prev;		\
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*(elm)->field.tqe_prev = (elm)->field.tqe_next;			\
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} while (0)
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define TAILQ_REPLACE(head, elm, elm2, field) do {			\
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (((elm2)->field.tqe_next = (elm)->field.tqe_next) != NULL)	\
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(elm2)->field.tqe_next->field.tqe_prev =		\
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    &(elm2)->field.tqe_next;				\
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else								\
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(head)->tqh_last = &(elm2)->field.tqe_next;		\
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(elm2)->field.tqe_prev = (elm)->field.tqe_prev;			\
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*(elm2)->field.tqe_prev = (elm2);				\
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} while (0)
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Circular queue definitions.
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CIRCLEQ_HEAD(name, type)					\
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct name {								\
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	struct type *cqh_first;		/* first element */		\
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	struct type *cqh_last;		/* last element */		\
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CIRCLEQ_HEAD_INITIALIZER(head)					\
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{ CIRCLEQ_END(&head), CIRCLEQ_END(&head) }
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CIRCLEQ_ENTRY(type)						\
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct {								\
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	struct type *cqe_next;		/* next element */		\
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	struct type *cqe_prev;		/* previous element */		\
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Circular queue access methods
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define	CIRCLEQ_FIRST(head)		((head)->cqh_first)
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define	CIRCLEQ_LAST(head)		((head)->cqh_last)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define	CIRCLEQ_END(head)		((void *)(head))
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define	CIRCLEQ_NEXT(elm, field)	((elm)->field.cqe_next)
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define	CIRCLEQ_PREV(elm, field)	((elm)->field.cqe_prev)
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define	CIRCLEQ_EMPTY(head)						\
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(CIRCLEQ_FIRST(head) == CIRCLEQ_END(head))
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CIRCLEQ_FOREACH(var, head, field)				\
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for((var) = CIRCLEQ_FIRST(head);				\
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (var) != CIRCLEQ_END(head);					\
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (var) = CIRCLEQ_NEXT(var, field))
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CIRCLEQ_FOREACH_REVERSE(var, head, field)			\
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for((var) = CIRCLEQ_LAST(head);					\
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (var) != CIRCLEQ_END(head);					\
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (var) = CIRCLEQ_PREV(var, field))
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Circular queue functions.
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define	CIRCLEQ_INIT(head) do {						\
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(head)->cqh_first = CIRCLEQ_END(head);				\
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(head)->cqh_last = CIRCLEQ_END(head);				\
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} while (0)
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) do {		\
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(elm)->field.cqe_next = (listelm)->field.cqe_next;		\
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(elm)->field.cqe_prev = (listelm);				\
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((listelm)->field.cqe_next == CIRCLEQ_END(head))		\
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(head)->cqh_last = (elm);				\
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else								\
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(listelm)->field.cqe_next->field.cqe_prev = (elm);	\
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(listelm)->field.cqe_next = (elm);				\
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} while (0)
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) do {		\
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(elm)->field.cqe_next = (listelm);				\
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(elm)->field.cqe_prev = (listelm)->field.cqe_prev;		\
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((listelm)->field.cqe_prev == CIRCLEQ_END(head))		\
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(head)->cqh_first = (elm);				\
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else								\
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(listelm)->field.cqe_prev->field.cqe_next = (elm);	\
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(listelm)->field.cqe_prev = (elm);				\
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} while (0)
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CIRCLEQ_INSERT_HEAD(head, elm, field) do {			\
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(elm)->field.cqe_next = (head)->cqh_first;			\
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(elm)->field.cqe_prev = CIRCLEQ_END(head);			\
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((head)->cqh_last == CIRCLEQ_END(head))			\
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(head)->cqh_last = (elm);				\
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else								\
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(head)->cqh_first->field.cqe_prev = (elm);		\
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(head)->cqh_first = (elm);					\
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} while (0)
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CIRCLEQ_INSERT_TAIL(head, elm, field) do {			\
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(elm)->field.cqe_next = CIRCLEQ_END(head);			\
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(elm)->field.cqe_prev = (head)->cqh_last;			\
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((head)->cqh_first == CIRCLEQ_END(head))			\
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(head)->cqh_first = (elm);				\
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else								\
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(head)->cqh_last->field.cqe_next = (elm);		\
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(head)->cqh_last = (elm);					\
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} while (0)
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define	CIRCLEQ_REMOVE(head, elm, field) do {				\
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((elm)->field.cqe_next == CIRCLEQ_END(head))			\
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(head)->cqh_last = (elm)->field.cqe_prev;		\
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else								\
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(elm)->field.cqe_next->field.cqe_prev =			\
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (elm)->field.cqe_prev;				\
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((elm)->field.cqe_prev == CIRCLEQ_END(head))			\
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(head)->cqh_first = (elm)->field.cqe_next;		\
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else								\
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(elm)->field.cqe_prev->field.cqe_next =			\
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (elm)->field.cqe_next;				\
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} while (0)
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CIRCLEQ_REPLACE(head, elm, elm2, field) do {			\
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (((elm2)->field.cqe_next = (elm)->field.cqe_next) ==		\
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    CIRCLEQ_END(head))						\
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(head).cqh_last = (elm2);				\
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else								\
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(elm2)->field.cqe_next->field.cqe_prev = (elm2);	\
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (((elm2)->field.cqe_prev = (elm)->field.cqe_prev) ==		\
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    CIRCLEQ_END(head))						\
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(head).cqh_first = (elm2);				\
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else								\
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(elm2)->field.cqe_prev->field.cqe_next = (elm2);	\
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} while (0)
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif	/* !_SYS_QUEUE_H_ */
489