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