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