1a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner/* $NetBSD: queue.h,v 1.52 2009/04/20 09:56:08 mschuett Exp $ */ 25d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 35d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* 45d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * Qemu version: Copy from netbsd, removed debug code, removed some of 5a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner * the implementations. Left in lists, simple queues, tail queues and 6a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner * circular queues. 75d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner */ 85d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 95d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* 105d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * Copyright (c) 1991, 1993 115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * The Regents of the University of California. All rights reserved. 125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * 135d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * Redistribution and use in source and binary forms, with or without 145d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * modification, are permitted provided that the following conditions 155d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * are met: 165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * 1. Redistributions of source code must retain the above copyright 175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * notice, this list of conditions and the following disclaimer. 185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * 2. Redistributions in binary form must reproduce the above copyright 195d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * notice, this list of conditions and the following disclaimer in the 205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * documentation and/or other materials provided with the distribution. 215d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * 3. Neither the name of the University nor the names of its contributors 225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * may be used to endorse or promote products derived from this software 235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * without specific prior written permission. 245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * 255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 315d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 325d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 355d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * SUCH DAMAGE. 365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * 375d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * @(#)queue.h 8.5 (Berkeley) 8/20/94 385d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner */ 395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 40a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#ifndef QEMU_SYS_QUEUE_H_ 41a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QEMU_SYS_QUEUE_H_ 425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* 44a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner * This file defines four types of data structures: 45a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner * lists, simple queues, tail queues, and circular queues. 465d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * 475d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * A list is headed by a single forward pointer (or an array of forward 485d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * pointers for a hash table header). The elements are doubly linked 495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * so that an arbitrary element can be removed without a need to 505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * traverse the list. New elements can be added to the list before 515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * or after an existing element or at the head of the list. A list 525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * may only be traversed in the forward direction. 535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * 54a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner * A simple queue is headed by a pair of pointers, one the head of the 55a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner * list and the other to the tail of the list. The elements are singly 56a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner * linked to save space, so elements can only be removed from the 57a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner * head of the list. New elements can be added to the list after 58a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner * an existing element, at the head of the list, or at the end of the 59a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner * list. A simple queue may only be traversed in the forward direction. 60a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner * 615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * A tail queue is headed by a pair of pointers, one to the head of the 625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * list and the other to the tail of the list. The elements are doubly 635d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * linked so that an arbitrary element can be removed without a need to 645d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * traverse the list. New elements can be added to the list before or 655d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * after an existing element, at the head of the list, or at the end of 665d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * the list. A tail queue may be traversed in either direction. 675d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * 685d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * A circle queue is headed by a pair of pointers, one to the head of the 695d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * list and the other to the tail of the list. The elements are doubly 705d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * linked so that an arbitrary element can be removed without a need to 715d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * traverse the list. New elements can be added to the list before or after 725d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * an existing element, at the head of the list, or at the end of the list. 735d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * A circle queue may be traversed in either direction, but has a more 745d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * complex end of list detection. 755d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * 765d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * For details on the use of these macros, see the queue(3) manual page. 775d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner */ 785d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 795d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* 805d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * List definitions. 815d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner */ 82a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QLIST_HEAD(name, type) \ 835d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstruct name { \ 845d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner struct type *lh_first; /* first element */ \ 855d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 865d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 87a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QLIST_HEAD_INITIALIZER(head) \ 885d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner { NULL } 895d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 90a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QLIST_ENTRY(type) \ 915d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstruct { \ 925d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner struct type *le_next; /* next element */ \ 935d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner struct type **le_prev; /* address of previous next element */ \ 945d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 955d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 965d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* 975d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * List functions. 985d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner */ 99a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QLIST_INIT(head) do { \ 1005d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (head)->lh_first = NULL; \ 1015d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} while (/*CONSTCOND*/0) 1025d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 103a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QLIST_INSERT_AFTER(listelm, elm, field) do { \ 1045d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (((elm)->field.le_next = (listelm)->field.le_next) != NULL) \ 1055d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (listelm)->field.le_next->field.le_prev = \ 1065d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner &(elm)->field.le_next; \ 1075d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (listelm)->field.le_next = (elm); \ 1085d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (elm)->field.le_prev = &(listelm)->field.le_next; \ 1095d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} while (/*CONSTCOND*/0) 1105d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 111a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QLIST_INSERT_BEFORE(listelm, elm, field) do { \ 1125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (elm)->field.le_prev = (listelm)->field.le_prev; \ 1135d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (elm)->field.le_next = (listelm); \ 1145d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner *(listelm)->field.le_prev = (elm); \ 1155d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (listelm)->field.le_prev = &(elm)->field.le_next; \ 1165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} while (/*CONSTCOND*/0) 1175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 118a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QLIST_INSERT_HEAD(head, elm, field) do { \ 1195d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (((elm)->field.le_next = (head)->lh_first) != NULL) \ 1205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (head)->lh_first->field.le_prev = &(elm)->field.le_next;\ 1215d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (head)->lh_first = (elm); \ 1225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (elm)->field.le_prev = &(head)->lh_first; \ 1235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} while (/*CONSTCOND*/0) 1245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 125a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QLIST_REMOVE(elm, field) do { \ 1265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if ((elm)->field.le_next != NULL) \ 1275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (elm)->field.le_next->field.le_prev = \ 1285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (elm)->field.le_prev; \ 1295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner *(elm)->field.le_prev = (elm)->field.le_next; \ 1305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} while (/*CONSTCOND*/0) 1315d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 132a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QLIST_FOREACH(var, head, field) \ 1335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner for ((var) = ((head)->lh_first); \ 1345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (var); \ 1355d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (var) = ((var)->field.le_next)) 1365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 137a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QLIST_FOREACH_SAFE(var, head, field, next_var) \ 138a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner for ((var) = ((head)->lh_first); \ 139a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner (var) && ((next_var) = ((var)->field.le_next), 1); \ 140a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner (var) = (next_var)) 141a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner 1425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* 1435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * List access methods. 1445d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner */ 145a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QLIST_EMPTY(head) ((head)->lh_first == NULL) 146a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QLIST_FIRST(head) ((head)->lh_first) 147a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QLIST_NEXT(elm, field) ((elm)->field.le_next) 148a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner 149a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner 150a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner/* 151a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner * Simple queue definitions. 152a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner */ 153a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QSIMPLEQ_HEAD(name, type) \ 154a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turnerstruct name { \ 155a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner struct type *sqh_first; /* first element */ \ 156a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner struct type **sqh_last; /* addr of last next element */ \ 157a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner} 158a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner 159a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QSIMPLEQ_HEAD_INITIALIZER(head) \ 160a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner { NULL, &(head).sqh_first } 161a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner 162a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QSIMPLEQ_ENTRY(type) \ 163a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turnerstruct { \ 164a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner struct type *sqe_next; /* next element */ \ 165a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner} 166a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner 167a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner/* 168a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner * Simple queue functions. 169a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner */ 170a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QSIMPLEQ_INIT(head) do { \ 171a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner (head)->sqh_first = NULL; \ 172a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner (head)->sqh_last = &(head)->sqh_first; \ 173a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner} while (/*CONSTCOND*/0) 174a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner 175a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QSIMPLEQ_INSERT_HEAD(head, elm, field) do { \ 176a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner if (((elm)->field.sqe_next = (head)->sqh_first) == NULL) \ 177a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner (head)->sqh_last = &(elm)->field.sqe_next; \ 178a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner (head)->sqh_first = (elm); \ 179a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner} while (/*CONSTCOND*/0) 180a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner 181a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QSIMPLEQ_INSERT_TAIL(head, elm, field) do { \ 182a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner (elm)->field.sqe_next = NULL; \ 183a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner *(head)->sqh_last = (elm); \ 184a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner (head)->sqh_last = &(elm)->field.sqe_next; \ 185a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner} while (/*CONSTCOND*/0) 186a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner 187a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QSIMPLEQ_INSERT_AFTER(head, listelm, elm, field) do { \ 188a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner if (((elm)->field.sqe_next = (listelm)->field.sqe_next) == NULL) \ 189a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner (head)->sqh_last = &(elm)->field.sqe_next; \ 190a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner (listelm)->field.sqe_next = (elm); \ 191a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner} while (/*CONSTCOND*/0) 192a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner 193a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QSIMPLEQ_REMOVE_HEAD(head, field) do { \ 194a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner if (((head)->sqh_first = (head)->sqh_first->field.sqe_next) == NULL)\ 195a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner (head)->sqh_last = &(head)->sqh_first; \ 196a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner} while (/*CONSTCOND*/0) 197a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner 198a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QSIMPLEQ_REMOVE(head, elm, type, field) do { \ 199a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner if ((head)->sqh_first == (elm)) { \ 200a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner QSIMPLEQ_REMOVE_HEAD((head), field); \ 201a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner } else { \ 202a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner struct type *curelm = (head)->sqh_first; \ 203a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner while (curelm->field.sqe_next != (elm)) \ 204a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner curelm = curelm->field.sqe_next; \ 205a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner if ((curelm->field.sqe_next = \ 206a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner curelm->field.sqe_next->field.sqe_next) == NULL) \ 207a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner (head)->sqh_last = &(curelm)->field.sqe_next; \ 208a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner } \ 209a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner} while (/*CONSTCOND*/0) 210a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner 211a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QSIMPLEQ_FOREACH(var, head, field) \ 212a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner for ((var) = ((head)->sqh_first); \ 213a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner (var); \ 214a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner (var) = ((var)->field.sqe_next)) 215a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner 216a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QSIMPLEQ_FOREACH_SAFE(var, head, field, next) \ 217a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner for ((var) = ((head)->sqh_first); \ 218a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner (var) && ((next = ((var)->field.sqe_next)), 1); \ 219a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner (var) = (next)) 220a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner 221a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QSIMPLEQ_CONCAT(head1, head2) do { \ 222a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner if (!QSIMPLEQ_EMPTY((head2))) { \ 223a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner *(head1)->sqh_last = (head2)->sqh_first; \ 224a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner (head1)->sqh_last = (head2)->sqh_last; \ 225a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner QSIMPLEQ_INIT((head2)); \ 226a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner } \ 227a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner} while (/*CONSTCOND*/0) 228a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner 229a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QSIMPLEQ_LAST(head, type, field) \ 230a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner (QSIMPLEQ_EMPTY((head)) ? \ 231a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner NULL : \ 232a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner ((struct type *)(void *) \ 233a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner ((char *)((head)->sqh_last) - offsetof(struct type, field)))) 234a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner 235a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner/* 236a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner * Simple queue access methods. 237a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner */ 238a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QSIMPLEQ_EMPTY(head) ((head)->sqh_first == NULL) 239a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QSIMPLEQ_FIRST(head) ((head)->sqh_first) 240a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QSIMPLEQ_NEXT(elm, field) ((elm)->field.sqe_next) 2415d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 2425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 2435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* 2445d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * Tail queue definitions. 2455d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner */ 246a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define Q_TAILQ_HEAD(name, type, qual) \ 2475d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstruct name { \ 2485d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner qual type *tqh_first; /* first element */ \ 2495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner qual type *qual *tqh_last; /* addr of last next element */ \ 2505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 251a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QTAILQ_HEAD(name, type) Q_TAILQ_HEAD(name, struct type,) 2525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 253a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QTAILQ_HEAD_INITIALIZER(head) \ 2545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner { NULL, &(head).tqh_first } 2555d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 256a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define Q_TAILQ_ENTRY(type, qual) \ 2575d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstruct { \ 2585d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner qual type *tqe_next; /* next element */ \ 2595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner qual type *qual *tqe_prev; /* address of previous next element */\ 2605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 261a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QTAILQ_ENTRY(type) Q_TAILQ_ENTRY(struct type,) 2625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 2635d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* 2645d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * Tail queue functions. 2655d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner */ 266a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QTAILQ_INIT(head) do { \ 2675d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (head)->tqh_first = NULL; \ 2685d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (head)->tqh_last = &(head)->tqh_first; \ 2695d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} while (/*CONSTCOND*/0) 2705d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 271a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QTAILQ_INSERT_HEAD(head, elm, field) do { \ 2725d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (((elm)->field.tqe_next = (head)->tqh_first) != NULL) \ 2735d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (head)->tqh_first->field.tqe_prev = \ 2745d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner &(elm)->field.tqe_next; \ 2755d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner else \ 2765d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (head)->tqh_last = &(elm)->field.tqe_next; \ 2775d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (head)->tqh_first = (elm); \ 2785d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (elm)->field.tqe_prev = &(head)->tqh_first; \ 2795d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} while (/*CONSTCOND*/0) 2805d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 281a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QTAILQ_INSERT_TAIL(head, elm, field) do { \ 2825d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (elm)->field.tqe_next = NULL; \ 2835d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (elm)->field.tqe_prev = (head)->tqh_last; \ 2845d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner *(head)->tqh_last = (elm); \ 2855d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (head)->tqh_last = &(elm)->field.tqe_next; \ 2865d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} while (/*CONSTCOND*/0) 2875d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 288a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QTAILQ_INSERT_AFTER(head, listelm, elm, field) do { \ 2895d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != NULL)\ 2905d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (elm)->field.tqe_next->field.tqe_prev = \ 2915d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner &(elm)->field.tqe_next; \ 2925d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner else \ 2935d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (head)->tqh_last = &(elm)->field.tqe_next; \ 2945d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (listelm)->field.tqe_next = (elm); \ 2955d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (elm)->field.tqe_prev = &(listelm)->field.tqe_next; \ 2965d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} while (/*CONSTCOND*/0) 2975d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 298a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QTAILQ_INSERT_BEFORE(listelm, elm, field) do { \ 2995d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \ 3005d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (elm)->field.tqe_next = (listelm); \ 3015d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner *(listelm)->field.tqe_prev = (elm); \ 3025d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (listelm)->field.tqe_prev = &(elm)->field.tqe_next; \ 3035d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} while (/*CONSTCOND*/0) 3045d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 305a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QTAILQ_REMOVE(head, elm, field) do { \ 3065d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (((elm)->field.tqe_next) != NULL) \ 3075d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (elm)->field.tqe_next->field.tqe_prev = \ 3085d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (elm)->field.tqe_prev; \ 3095d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner else \ 3105d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (head)->tqh_last = (elm)->field.tqe_prev; \ 3115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner *(elm)->field.tqe_prev = (elm)->field.tqe_next; \ 3125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} while (/*CONSTCOND*/0) 3135d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 314a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QTAILQ_FOREACH(var, head, field) \ 3155d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner for ((var) = ((head)->tqh_first); \ 3165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (var); \ 3175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (var) = ((var)->field.tqe_next)) 3185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 319a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QTAILQ_FOREACH_SAFE(var, head, field, next_var) \ 3205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner for ((var) = ((head)->tqh_first); \ 3215d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (var) && ((next_var) = ((var)->field.tqe_next), 1); \ 3225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (var) = (next_var)) 3235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 324a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QTAILQ_FOREACH_REVERSE(var, head, headname, field) \ 3255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner for ((var) = (*(((struct headname *)((head)->tqh_last))->tqh_last)); \ 3265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (var); \ 3275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (var) = (*(((struct headname *)((var)->field.tqe_prev))->tqh_last))) 3285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 3295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* 3305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * Tail queue access methods. 3315d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner */ 332a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QTAILQ_EMPTY(head) ((head)->tqh_first == NULL) 333a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QTAILQ_FIRST(head) ((head)->tqh_first) 334a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QTAILQ_NEXT(elm, field) ((elm)->field.tqe_next) 3355d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 336a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QTAILQ_LAST(head, headname) \ 3375d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (*(((struct headname *)((head)->tqh_last))->tqh_last)) 338a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QTAILQ_PREV(elm, headname, field) \ 3395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last)) 3405d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 3415d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 3425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* 3435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * Circular queue definitions. 3445d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner */ 345a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QCIRCLEQ_HEAD(name, type) \ 3465d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstruct name { \ 3475d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner struct type *cqh_first; /* first element */ \ 3485d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner struct type *cqh_last; /* last element */ \ 3495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 3505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 351a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QCIRCLEQ_HEAD_INITIALIZER(head) \ 3525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner { (void *)&head, (void *)&head } 3535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 354a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QCIRCLEQ_ENTRY(type) \ 3555d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstruct { \ 3565d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner struct type *cqe_next; /* next element */ \ 3575d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner struct type *cqe_prev; /* previous element */ \ 3585d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 3595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 3605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* 3615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * Circular queue functions. 3625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner */ 363a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QCIRCLEQ_INIT(head) do { \ 3645d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (head)->cqh_first = (void *)(head); \ 3655d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (head)->cqh_last = (void *)(head); \ 3665d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} while (/*CONSTCOND*/0) 3675d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 368a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QCIRCLEQ_INSERT_AFTER(head, listelm, elm, field) do { \ 3695d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (elm)->field.cqe_next = (listelm)->field.cqe_next; \ 3705d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (elm)->field.cqe_prev = (listelm); \ 3715d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if ((listelm)->field.cqe_next == (void *)(head)) \ 3725d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (head)->cqh_last = (elm); \ 3735d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner else \ 3745d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (listelm)->field.cqe_next->field.cqe_prev = (elm); \ 3755d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (listelm)->field.cqe_next = (elm); \ 3765d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} while (/*CONSTCOND*/0) 3775d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 378a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QCIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) do { \ 3795d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (elm)->field.cqe_next = (listelm); \ 3805d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (elm)->field.cqe_prev = (listelm)->field.cqe_prev; \ 3815d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if ((listelm)->field.cqe_prev == (void *)(head)) \ 3825d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (head)->cqh_first = (elm); \ 3835d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner else \ 3845d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (listelm)->field.cqe_prev->field.cqe_next = (elm); \ 3855d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (listelm)->field.cqe_prev = (elm); \ 3865d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} while (/*CONSTCOND*/0) 3875d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 388a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QCIRCLEQ_INSERT_HEAD(head, elm, field) do { \ 3895d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (elm)->field.cqe_next = (head)->cqh_first; \ 3905d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (elm)->field.cqe_prev = (void *)(head); \ 3915d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if ((head)->cqh_last == (void *)(head)) \ 3925d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (head)->cqh_last = (elm); \ 3935d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner else \ 3945d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (head)->cqh_first->field.cqe_prev = (elm); \ 3955d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (head)->cqh_first = (elm); \ 3965d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} while (/*CONSTCOND*/0) 3975d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 398a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QCIRCLEQ_INSERT_TAIL(head, elm, field) do { \ 3995d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (elm)->field.cqe_next = (void *)(head); \ 4005d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (elm)->field.cqe_prev = (head)->cqh_last; \ 4015d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if ((head)->cqh_first == (void *)(head)) \ 4025d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (head)->cqh_first = (elm); \ 4035d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner else \ 4045d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (head)->cqh_last->field.cqe_next = (elm); \ 4055d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (head)->cqh_last = (elm); \ 4065d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} while (/*CONSTCOND*/0) 4075d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 408a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QCIRCLEQ_REMOVE(head, elm, field) do { \ 4095d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if ((elm)->field.cqe_next == (void *)(head)) \ 4105d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (head)->cqh_last = (elm)->field.cqe_prev; \ 4115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner else \ 4125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (elm)->field.cqe_next->field.cqe_prev = \ 4135d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (elm)->field.cqe_prev; \ 4145d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if ((elm)->field.cqe_prev == (void *)(head)) \ 4155d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (head)->cqh_first = (elm)->field.cqe_next; \ 4165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner else \ 4175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (elm)->field.cqe_prev->field.cqe_next = \ 4185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (elm)->field.cqe_next; \ 4195d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} while (/*CONSTCOND*/0) 4205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 421a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QCIRCLEQ_FOREACH(var, head, field) \ 4225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner for ((var) = ((head)->cqh_first); \ 4235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (var) != (const void *)(head); \ 4245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (var) = ((var)->field.cqe_next)) 4255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 426a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QCIRCLEQ_FOREACH_REVERSE(var, head, field) \ 4275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner for ((var) = ((head)->cqh_last); \ 4285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (var) != (const void *)(head); \ 4295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (var) = ((var)->field.cqe_prev)) 4305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 4315d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* 4325d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * Circular queue access methods. 4335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner */ 434a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QCIRCLEQ_EMPTY(head) ((head)->cqh_first == (void *)(head)) 435a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QCIRCLEQ_FIRST(head) ((head)->cqh_first) 436a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QCIRCLEQ_LAST(head) ((head)->cqh_last) 437a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QCIRCLEQ_NEXT(elm, field) ((elm)->field.cqe_next) 438a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QCIRCLEQ_PREV(elm, field) ((elm)->field.cqe_prev) 4395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 440a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QCIRCLEQ_LOOP_NEXT(head, elm, field) \ 4415d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (((elm)->field.cqe_next == (void *)(head)) \ 4425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner ? ((head)->cqh_first) \ 4435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner : (elm->field.cqe_next)) 444a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#define QCIRCLEQ_LOOP_PREV(head, elm, field) \ 4455d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (((elm)->field.cqe_prev == (void *)(head)) \ 4465d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner ? ((head)->cqh_last) \ 4475d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner : (elm->field.cqe_prev)) 4485d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 449a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#endif /* !QEMU_SYS_QUEUE_H_ */ 450