11ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen/*- 21ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * Copyright (c) 1991, 1993 31ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * The Regents of the University of California. All rights reserved. 41ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * 51ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * Redistribution and use in source and binary forms, with or without 61ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * modification, are permitted provided that the following conditions 71ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * are met: 81ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * 1. Redistributions of source code must retain the above copyright 91ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * notice, this list of conditions and the following disclaimer. 101ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * 2. Redistributions in binary form must reproduce the above copyright 111ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * notice, this list of conditions and the following disclaimer in the 121ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * documentation and/or other materials provided with the distribution. 131ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * 4. Neither the name of the University nor the names of its contributors 141ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * may be used to endorse or promote products derived from this software 151ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * without specific prior written permission. 161ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * 171ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 181ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 191ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 201ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 211ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 221ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 231ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 241ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 251ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 261ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 271ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * SUCH DAMAGE. 281ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * 291ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen */ 301ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 31829d1a776d2fc5124c1701da541079d0e17da6b3tuexen#ifndef _USER_QUEUE_H_ 32829d1a776d2fc5124c1701da541079d0e17da6b3tuexen#define _USER_QUEUE_H_ 33829d1a776d2fc5124c1701da541079d0e17da6b3tuexen 341ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#if !defined (__Userspace_os_Windows) 351ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#include <sys/cdefs.h> 361ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#endif 371ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen/* 381ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * This file defines four types of data structures: singly-linked lists, 391ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * singly-linked tail queues, lists and tail queues. 401ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * 411ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * A singly-linked list is headed by a single forward pointer. The elements 421ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * are singly linked for minimum space and pointer manipulation overhead at 431ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * the expense of O(n) removal for arbitrary elements. New elements can be 441ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * added to the list after an existing element or at the head of the list. 451ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * Elements being removed from the head of the list should use the explicit 461ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * macro for this purpose for optimum efficiency. A singly-linked list may 471ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * only be traversed in the forward direction. Singly-linked lists are ideal 481ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * for applications with large datasets and few or no removals or for 491ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * implementing a LIFO queue. 501ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * 511ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * A singly-linked tail queue is headed by a pair of pointers, one to the 521ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * head of the list and the other to the tail of the list. The elements are 531ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * singly linked for minimum space and pointer manipulation overhead at the 541ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * expense of O(n) removal for arbitrary elements. New elements can be added 551ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * to the list after an existing element, at the head of the list, or at the 561ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * end of the list. Elements being removed from the head of the tail queue 571ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * should use the explicit macro for this purpose for optimum efficiency. 581ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * A singly-linked tail queue may only be traversed in the forward direction. 591ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * Singly-linked tail queues are ideal for applications with large datasets 601ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * and few or no removals or for implementing a FIFO queue. 611ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * 621ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * A list is headed by a single forward pointer (or an array of forward 631ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * pointers for a hash table header). The elements are doubly linked 641ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * so that an arbitrary element can be removed without a need to 651ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * traverse the list. New elements can be added to the list before 661ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * or after an existing element or at the head of the list. A list 671ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * may only be traversed in the forward direction. 681ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * 691ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * A tail queue is headed by a pair of pointers, one to the head of the 701ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * list and the other to the tail of the list. The elements are doubly 711ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * linked so that an arbitrary element can be removed without a need to 721ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * traverse the list. New elements can be added to the list before or 731ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * after an existing element, at the head of the list, or at the end of 741ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * the list. A tail queue may be traversed in either direction. 751ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * 761ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * For details on the use of these macros, see the queue(3) manual page. 771ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * 781ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * 791ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * SLIST LIST STAILQ TAILQ 801ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * _HEAD + + + + 811ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * _HEAD_INITIALIZER + + + + 821ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * _ENTRY + + + + 831ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * _INIT + + + + 841ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * _EMPTY + + + + 851ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * _FIRST + + + + 861ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * _NEXT + + + + 871ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * _PREV - - - + 881ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * _LAST - - + + 891ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * _FOREACH + + + + 901ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * _FOREACH_SAFE + + + + 911ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * _FOREACH_REVERSE - - - + 921ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * _FOREACH_REVERSE_SAFE - - - + 931ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * _INSERT_HEAD + + + + 941ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * _INSERT_BEFORE - + - + 951ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * _INSERT_AFTER + + + + 961ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * _INSERT_TAIL - - + + 971ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * _CONCAT - - + + 981ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * _REMOVE_AFTER + - + - 991ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * _REMOVE_HEAD + - + - 1001ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * _REMOVE + + + + 1011ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * _SWAP + + + + 1021ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * 1031ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen */ 1041ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#ifdef QUEUE_MACRO_DEBUG 1051ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen/* Store the last 2 places the queue element or head was altered */ 1061ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexenstruct qm_trace { 1071ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen char * lastfile; 1081ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen int lastline; 1091ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen char * prevfile; 1101ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen int prevline; 1111ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen}; 1121ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 1131ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define TRACEBUF struct qm_trace trace; 1141ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define TRASHIT(x) do {(x) = (void *)-1;} while (0) 1151ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define QMD_SAVELINK(name, link) void **name = (void *)&(link) 1161ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 1171ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define QMD_TRACE_HEAD(head) do { \ 1181ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (head)->trace.prevline = (head)->trace.lastline; \ 1191ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (head)->trace.prevfile = (head)->trace.lastfile; \ 1201ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (head)->trace.lastline = __LINE__; \ 1211ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (head)->trace.lastfile = __FILE__; \ 1221ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen} while (0) 1231ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 1241ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define QMD_TRACE_ELEM(elem) do { \ 1251ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (elem)->trace.prevline = (elem)->trace.lastline; \ 1261ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (elem)->trace.prevfile = (elem)->trace.lastfile; \ 1271ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (elem)->trace.lastline = __LINE__; \ 1281ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (elem)->trace.lastfile = __FILE__; \ 1291ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen} while (0) 1301ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 1311ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#else 1321ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define QMD_TRACE_ELEM(elem) 1331ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define QMD_TRACE_HEAD(head) 1341ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define QMD_SAVELINK(name, link) 1351ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define TRACEBUF 1361ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define TRASHIT(x) 1371ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#endif /* QUEUE_MACRO_DEBUG */ 1381ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 1391ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen/* 1401ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * Singly-linked List declarations. 1411ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen */ 1421ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define SLIST_HEAD(name, type) \ 1431ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexenstruct name { \ 1441ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen struct type *slh_first; /* first element */ \ 1451ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen} 1461ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 1471ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define SLIST_HEAD_INITIALIZER(head) \ 1481ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen { NULL } 1491ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 1501ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#if defined (__Userspace_os_Windows) 1511ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#if defined (SLIST_ENTRY) 1521ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#undef SLIST_ENTRY 1531ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#endif 1541ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#endif 1551ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 1561ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define SLIST_ENTRY(type) \ 1571ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexenstruct { \ 1581ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen struct type *sle_next; /* next element */ \ 1591ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen} 1601ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 1611ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen/* 1621ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * Singly-linked List functions. 1631ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen */ 1641ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define SLIST_EMPTY(head) ((head)->slh_first == NULL) 1651ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 1661ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define SLIST_FIRST(head) ((head)->slh_first) 1671ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 1681ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define SLIST_FOREACH(var, head, field) \ 1691ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen for ((var) = SLIST_FIRST((head)); \ 1701ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (var); \ 1711ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (var) = SLIST_NEXT((var), field)) 1721ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 1731ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define SLIST_FOREACH_SAFE(var, head, field, tvar) \ 1741ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen for ((var) = SLIST_FIRST((head)); \ 1751ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (var) && ((tvar) = SLIST_NEXT((var), field), 1); \ 1761ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (var) = (tvar)) 1771ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 1781ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define SLIST_FOREACH_PREVPTR(var, varp, head, field) \ 1791ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen for ((varp) = &SLIST_FIRST((head)); \ 1801ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen ((var) = *(varp)) != NULL; \ 1811ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (varp) = &SLIST_NEXT((var), field)) 1821ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 1831ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define SLIST_INIT(head) do { \ 1841ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen SLIST_FIRST((head)) = NULL; \ 1851ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen} while (0) 1861ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 1871ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define SLIST_INSERT_AFTER(slistelm, elm, field) do { \ 1881ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen SLIST_NEXT((elm), field) = SLIST_NEXT((slistelm), field); \ 1891ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen SLIST_NEXT((slistelm), field) = (elm); \ 1901ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen} while (0) 1911ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 1921ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define SLIST_INSERT_HEAD(head, elm, field) do { \ 1931ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen SLIST_NEXT((elm), field) = SLIST_FIRST((head)); \ 1941ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen SLIST_FIRST((head)) = (elm); \ 1951ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen} while (0) 1961ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 1971ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define SLIST_NEXT(elm, field) ((elm)->field.sle_next) 1981ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 1991ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define SLIST_REMOVE(head, elm, type, field) do { \ 2001ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen QMD_SAVELINK(oldnext, (elm)->field.sle_next); \ 2011ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen if (SLIST_FIRST((head)) == (elm)) { \ 2021ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen SLIST_REMOVE_HEAD((head), field); \ 2031ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen } \ 2041ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen else { \ 2051ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen struct type *curelm = SLIST_FIRST((head)); \ 2061ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen while (SLIST_NEXT(curelm, field) != (elm)) \ 2071ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen curelm = SLIST_NEXT(curelm, field); \ 2081ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen SLIST_REMOVE_AFTER(curelm, field); \ 2091ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen } \ 2101ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen TRASHIT(*oldnext); \ 2111ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen} while (0) 2121ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 2131ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define SLIST_REMOVE_AFTER(elm, field) do { \ 2141ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen SLIST_NEXT(elm, field) = \ 2151ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen SLIST_NEXT(SLIST_NEXT(elm, field), field); \ 2161ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen} while (0) 2171ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 2181ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define SLIST_REMOVE_HEAD(head, field) do { \ 2191ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen SLIST_FIRST((head)) = SLIST_NEXT(SLIST_FIRST((head)), field); \ 2201ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen} while (0) 2211ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 2221ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define SLIST_SWAP(head1, head2, type) do { \ 2231ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen struct type *swap_first = SLIST_FIRST(head1); \ 2241ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen SLIST_FIRST(head1) = SLIST_FIRST(head2); \ 2251ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen SLIST_FIRST(head2) = swap_first; \ 2261ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen} while (0) 2271ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 2281ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen/* 2291ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * Singly-linked Tail queue declarations. 2301ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen */ 2311ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define STAILQ_HEAD(name, type) \ 2321ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexenstruct name { \ 2331ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen struct type *stqh_first;/* first element */ \ 2341ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen struct type **stqh_last;/* addr of last next element */ \ 2351ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen} 2361ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 2371ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define STAILQ_HEAD_INITIALIZER(head) \ 2381ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen { NULL, &(head).stqh_first } 2391ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 2401ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define STAILQ_ENTRY(type) \ 2411ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexenstruct { \ 2421ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen struct type *stqe_next; /* next element */ \ 2431ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen} 2441ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 2451ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen/* 2461ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * Singly-linked Tail queue functions. 2471ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen */ 2481ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define STAILQ_CONCAT(head1, head2) do { \ 2491ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen if (!STAILQ_EMPTY((head2))) { \ 2501ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen *(head1)->stqh_last = (head2)->stqh_first; \ 2511ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (head1)->stqh_last = (head2)->stqh_last; \ 2521ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen STAILQ_INIT((head2)); \ 2531ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen } \ 2541ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen} while (0) 2551ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 2561ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define STAILQ_EMPTY(head) ((head)->stqh_first == NULL) 2571ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 2581ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define STAILQ_FIRST(head) ((head)->stqh_first) 2591ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 2601ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define STAILQ_FOREACH(var, head, field) \ 2611ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen for((var) = STAILQ_FIRST((head)); \ 2621ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (var); \ 2631ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (var) = STAILQ_NEXT((var), field)) 2641ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 2651ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 2661ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define STAILQ_FOREACH_SAFE(var, head, field, tvar) \ 2671ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen for ((var) = STAILQ_FIRST((head)); \ 2681ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (var) && ((tvar) = STAILQ_NEXT((var), field), 1); \ 2691ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (var) = (tvar)) 2701ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 2711ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define STAILQ_INIT(head) do { \ 2721ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen STAILQ_FIRST((head)) = NULL; \ 2731ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (head)->stqh_last = &STAILQ_FIRST((head)); \ 2741ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen} while (0) 2751ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 2761ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define STAILQ_INSERT_AFTER(head, tqelm, elm, field) do { \ 2771ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen if ((STAILQ_NEXT((elm), field) = STAILQ_NEXT((tqelm), field)) == NULL)\ 2781ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (head)->stqh_last = &STAILQ_NEXT((elm), field); \ 2791ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen STAILQ_NEXT((tqelm), field) = (elm); \ 2801ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen} while (0) 2811ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 2821ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define STAILQ_INSERT_HEAD(head, elm, field) do { \ 2831ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen if ((STAILQ_NEXT((elm), field) = STAILQ_FIRST((head))) == NULL) \ 2841ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (head)->stqh_last = &STAILQ_NEXT((elm), field); \ 2851ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen STAILQ_FIRST((head)) = (elm); \ 2861ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen} while (0) 2871ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 2881ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define STAILQ_INSERT_TAIL(head, elm, field) do { \ 2891ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen STAILQ_NEXT((elm), field) = NULL; \ 2901ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen *(head)->stqh_last = (elm); \ 2911ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (head)->stqh_last = &STAILQ_NEXT((elm), field); \ 2921ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen} while (0) 2931ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 2941ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define STAILQ_LAST(head, type, field) \ 2951ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (STAILQ_EMPTY((head)) ? \ 2961ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen NULL : \ 2971ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen ((struct type *)(void *) \ 2981ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen ((char *)((head)->stqh_last) - __offsetof(struct type, field)))) 2991ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 3001ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define STAILQ_NEXT(elm, field) ((elm)->field.stqe_next) 3011ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 3021ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define STAILQ_REMOVE(head, elm, type, field) do { \ 3031ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen QMD_SAVELINK(oldnext, (elm)->field.stqe_next); \ 3041ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen if (STAILQ_FIRST((head)) == (elm)) { \ 3051ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen STAILQ_REMOVE_HEAD((head), field); \ 3061ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen } \ 3071ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen else { \ 3081ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen struct type *curelm = STAILQ_FIRST((head)); \ 3091ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen while (STAILQ_NEXT(curelm, field) != (elm)) \ 3101ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen curelm = STAILQ_NEXT(curelm, field); \ 3111ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen STAILQ_REMOVE_AFTER(head, curelm, field); \ 3121ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen } \ 3131ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen TRASHIT(*oldnext); \ 3141ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen} while (0) 3151ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 3161ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define STAILQ_REMOVE_AFTER(head, elm, field) do { \ 3171ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen if ((STAILQ_NEXT(elm, field) = \ 3181ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen STAILQ_NEXT(STAILQ_NEXT(elm, field), field)) == NULL) \ 3191ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (head)->stqh_last = &STAILQ_NEXT((elm), field); \ 3201ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen} while (0) 3211ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 3221ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define STAILQ_REMOVE_HEAD(head, field) do { \ 3231ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen if ((STAILQ_FIRST((head)) = \ 3241ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen STAILQ_NEXT(STAILQ_FIRST((head)), field)) == NULL) \ 3251ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (head)->stqh_last = &STAILQ_FIRST((head)); \ 3261ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen} while (0) 3271ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 3281ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define STAILQ_SWAP(head1, head2, type) do { \ 3291ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen struct type *swap_first = STAILQ_FIRST(head1); \ 3301ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen struct type **swap_last = (head1)->stqh_last; \ 3311ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen STAILQ_FIRST(head1) = STAILQ_FIRST(head2); \ 3321ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (head1)->stqh_last = (head2)->stqh_last; \ 3331ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen STAILQ_FIRST(head2) = swap_first; \ 3341ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (head2)->stqh_last = swap_last; \ 3351ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen if (STAILQ_EMPTY(head1)) \ 3361ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (head1)->stqh_last = &STAILQ_FIRST(head1); \ 3371ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen if (STAILQ_EMPTY(head2)) \ 3381ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (head2)->stqh_last = &STAILQ_FIRST(head2); \ 3391ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen} while (0) 3401ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 3411ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 3421ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen/* 3431ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * List declarations. 3441ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen */ 3451ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define LIST_HEAD(name, type) \ 3461ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexenstruct name { \ 3471ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen struct type *lh_first; /* first element */ \ 3481ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen} 3491ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 3501ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define LIST_HEAD_INITIALIZER(head) \ 3511ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen { NULL } 3521ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 3531ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define LIST_ENTRY(type) \ 3541ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexenstruct { \ 3551ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen struct type *le_next; /* next element */ \ 3561ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen struct type **le_prev; /* address of previous next element */ \ 3571ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen} 3581ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 3591ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen/* 3601ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * List functions. 3611ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen */ 3621ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 36351f641f9d0f364650a40a39260724443f7e23ba3ruengeler#if defined(INVARIANTS) 364e7eb46f39b8bfc4b5ed9b708232c1c669c06842bt#define QMD_LIST_CHECK_HEAD(head, field) do { \ 365e7eb46f39b8bfc4b5ed9b708232c1c669c06842bt if (LIST_FIRST((head)) != NULL && \ 366e7eb46f39b8bfc4b5ed9b708232c1c669c06842bt LIST_FIRST((head))->field.le_prev != \ 367e7eb46f39b8bfc4b5ed9b708232c1c669c06842bt &LIST_FIRST((head))) \ 368e7eb46f39b8bfc4b5ed9b708232c1c669c06842bt panic("Bad list head %p first->prev != head", (void *)(head)); \ 3691ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen} while (0) 3701ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 371e7eb46f39b8bfc4b5ed9b708232c1c669c06842bt#define QMD_LIST_CHECK_NEXT(elm, field) do { \ 372e7eb46f39b8bfc4b5ed9b708232c1c669c06842bt if (LIST_NEXT((elm), field) != NULL && \ 373e7eb46f39b8bfc4b5ed9b708232c1c669c06842bt LIST_NEXT((elm), field)->field.le_prev != \ 374e7eb46f39b8bfc4b5ed9b708232c1c669c06842bt &((elm)->field.le_next)) \ 375e7eb46f39b8bfc4b5ed9b708232c1c669c06842bt panic("Bad link elm %p next->prev != elm", (void *)(elm)); \ 3761ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen} while (0) 3771ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 378e7eb46f39b8bfc4b5ed9b708232c1c669c06842bt#define QMD_LIST_CHECK_PREV(elm, field) do { \ 379e7eb46f39b8bfc4b5ed9b708232c1c669c06842bt if (*(elm)->field.le_prev != (elm)) \ 380e7eb46f39b8bfc4b5ed9b708232c1c669c06842bt panic("Bad link elm %p prev->next != elm", (void *)(elm)); \ 3811ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen} while (0) 3821ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#else 3831ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define QMD_LIST_CHECK_HEAD(head, field) 3841ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define QMD_LIST_CHECK_NEXT(elm, field) 3851ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define QMD_LIST_CHECK_PREV(elm, field) 386edd4507cda024159552eb3574f9ba93766ea33d8tuexen#endif /* (INVARIANTS) */ 3871ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 3881ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define LIST_EMPTY(head) ((head)->lh_first == NULL) 3891ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 3901ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define LIST_FIRST(head) ((head)->lh_first) 3911ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 3921ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define LIST_FOREACH(var, head, field) \ 3931ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen for ((var) = LIST_FIRST((head)); \ 3941ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (var); \ 3951ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (var) = LIST_NEXT((var), field)) 3961ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 3971ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define LIST_FOREACH_SAFE(var, head, field, tvar) \ 3981ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen for ((var) = LIST_FIRST((head)); \ 3991ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (var) && ((tvar) = LIST_NEXT((var), field), 1); \ 4001ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (var) = (tvar)) 4011ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 4021ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define LIST_INIT(head) do { \ 4031ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen LIST_FIRST((head)) = NULL; \ 4041ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen} while (0) 4051ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 4061ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define LIST_INSERT_AFTER(listelm, elm, field) do { \ 4071ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen QMD_LIST_CHECK_NEXT(listelm, field); \ 4081ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen if ((LIST_NEXT((elm), field) = LIST_NEXT((listelm), field)) != NULL)\ 4091ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen LIST_NEXT((listelm), field)->field.le_prev = \ 4101ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen &LIST_NEXT((elm), field); \ 4111ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen LIST_NEXT((listelm), field) = (elm); \ 4121ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (elm)->field.le_prev = &LIST_NEXT((listelm), field); \ 4131ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen} while (0) 4141ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 4151ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define LIST_INSERT_BEFORE(listelm, elm, field) do { \ 4161ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen QMD_LIST_CHECK_PREV(listelm, field); \ 4171ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (elm)->field.le_prev = (listelm)->field.le_prev; \ 4181ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen LIST_NEXT((elm), field) = (listelm); \ 4191ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen *(listelm)->field.le_prev = (elm); \ 4201ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (listelm)->field.le_prev = &LIST_NEXT((elm), field); \ 4211ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen} while (0) 4221ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 4231ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define LIST_INSERT_HEAD(head, elm, field) do { \ 4241ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen QMD_LIST_CHECK_HEAD((head), field); \ 4251ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen if ((LIST_NEXT((elm), field) = LIST_FIRST((head))) != NULL) \ 4261ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen LIST_FIRST((head))->field.le_prev = &LIST_NEXT((elm), field);\ 4271ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen LIST_FIRST((head)) = (elm); \ 4281ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (elm)->field.le_prev = &LIST_FIRST((head)); \ 4291ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen} while (0) 4301ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 4311ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define LIST_NEXT(elm, field) ((elm)->field.le_next) 4321ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 4331ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define LIST_REMOVE(elm, field) do { \ 4341ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen QMD_SAVELINK(oldnext, (elm)->field.le_next); \ 4351ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen QMD_SAVELINK(oldprev, (elm)->field.le_prev); \ 4361ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen QMD_LIST_CHECK_NEXT(elm, field); \ 4371ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen QMD_LIST_CHECK_PREV(elm, field); \ 4381ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen if (LIST_NEXT((elm), field) != NULL) \ 4391ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen LIST_NEXT((elm), field)->field.le_prev = \ 4401ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (elm)->field.le_prev; \ 4411ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen *(elm)->field.le_prev = LIST_NEXT((elm), field); \ 4421ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen TRASHIT(*oldnext); \ 4431ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen TRASHIT(*oldprev); \ 4441ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen} while (0) 4451ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 4461ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define LIST_SWAP(head1, head2, type, field) do { \ 4471ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen struct type *swap_tmp = LIST_FIRST((head1)); \ 4481ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen LIST_FIRST((head1)) = LIST_FIRST((head2)); \ 4491ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen LIST_FIRST((head2)) = swap_tmp; \ 4501ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen if ((swap_tmp = LIST_FIRST((head1))) != NULL) \ 4511ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen swap_tmp->field.le_prev = &LIST_FIRST((head1)); \ 4521ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen if ((swap_tmp = LIST_FIRST((head2))) != NULL) \ 4531ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen swap_tmp->field.le_prev = &LIST_FIRST((head2)); \ 4541ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen} while (0) 4551ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 4561ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen/* 4571ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * Tail queue declarations. 4581ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen */ 4591ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define TAILQ_HEAD(name, type) \ 4601ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexenstruct name { \ 4611ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen struct type *tqh_first; /* first element */ \ 4621ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen struct type **tqh_last; /* addr of last next element */ \ 4631ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen TRACEBUF \ 4641ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen} 4651ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 4661ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define TAILQ_HEAD_INITIALIZER(head) \ 4671ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen { NULL, &(head).tqh_first } 4681ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 4691ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define TAILQ_ENTRY(type) \ 4701ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexenstruct { \ 4711ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen struct type *tqe_next; /* next element */ \ 4721ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen struct type **tqe_prev; /* address of previous next element */ \ 4731ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen TRACEBUF \ 4741ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen} 4751ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 4761ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen/* 4771ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen * Tail queue functions. 4781ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen */ 479edd4507cda024159552eb3574f9ba93766ea33d8tuexen#if defined(INVARIANTS) 480e7eb46f39b8bfc4b5ed9b708232c1c669c06842bt#define QMD_TAILQ_CHECK_HEAD(head, field) do { \ 481e7eb46f39b8bfc4b5ed9b708232c1c669c06842bt if (!TAILQ_EMPTY(head) && \ 482e7eb46f39b8bfc4b5ed9b708232c1c669c06842bt TAILQ_FIRST((head))->field.tqe_prev != \ 483e7eb46f39b8bfc4b5ed9b708232c1c669c06842bt &TAILQ_FIRST((head))) \ 484e7eb46f39b8bfc4b5ed9b708232c1c669c06842bt panic("Bad tailq head %p first->prev != head", (void *)(head)); \ 4851ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen} while (0) 4861ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 487e7eb46f39b8bfc4b5ed9b708232c1c669c06842bt#define QMD_TAILQ_CHECK_TAIL(head, field) do { \ 488e7eb46f39b8bfc4b5ed9b708232c1c669c06842bt if (*(head)->tqh_last != NULL) \ 489e7eb46f39b8bfc4b5ed9b708232c1c669c06842bt panic("Bad tailq NEXT(%p->tqh_last) != NULL", (void *)(head)); \ 4901ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen} while (0) 4911ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 492e7eb46f39b8bfc4b5ed9b708232c1c669c06842bt#define QMD_TAILQ_CHECK_NEXT(elm, field) do { \ 493e7eb46f39b8bfc4b5ed9b708232c1c669c06842bt if (TAILQ_NEXT((elm), field) != NULL && \ 494e7eb46f39b8bfc4b5ed9b708232c1c669c06842bt TAILQ_NEXT((elm), field)->field.tqe_prev != \ 495e7eb46f39b8bfc4b5ed9b708232c1c669c06842bt &((elm)->field.tqe_next)) \ 496e7eb46f39b8bfc4b5ed9b708232c1c669c06842bt panic("Bad link elm %p next->prev != elm", (void *)(elm)); \ 4971ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen} while (0) 4981ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 499e7eb46f39b8bfc4b5ed9b708232c1c669c06842bt#define QMD_TAILQ_CHECK_PREV(elm, field) do { \ 500e7eb46f39b8bfc4b5ed9b708232c1c669c06842bt if (*(elm)->field.tqe_prev != (elm)) \ 501e7eb46f39b8bfc4b5ed9b708232c1c669c06842bt panic("Bad link elm %p prev->next != elm", (void *)(elm)); \ 5021ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen} while (0) 5031ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#else 5041ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define QMD_TAILQ_CHECK_HEAD(head, field) 5051ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define QMD_TAILQ_CHECK_TAIL(head, headname) 5061ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define QMD_TAILQ_CHECK_NEXT(elm, field) 5071ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define QMD_TAILQ_CHECK_PREV(elm, field) 508edd4507cda024159552eb3574f9ba93766ea33d8tuexen#endif /* (INVARIANTS) */ 5091ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 5101ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define TAILQ_CONCAT(head1, head2, field) do { \ 5111ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen if (!TAILQ_EMPTY(head2)) { \ 5121ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen *(head1)->tqh_last = (head2)->tqh_first; \ 5131ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (head2)->tqh_first->field.tqe_prev = (head1)->tqh_last; \ 5141ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (head1)->tqh_last = (head2)->tqh_last; \ 5151ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen TAILQ_INIT((head2)); \ 5161ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen QMD_TRACE_HEAD(head1); \ 5171ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen QMD_TRACE_HEAD(head2); \ 5181ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen } \ 5191ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen} while (0) 5201ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 5211ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define TAILQ_EMPTY(head) ((head)->tqh_first == NULL) 5221ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 5231ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define TAILQ_FIRST(head) ((head)->tqh_first) 5241ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 5251ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define TAILQ_FOREACH(var, head, field) \ 5261ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen for ((var) = TAILQ_FIRST((head)); \ 5271ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (var); \ 5281ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (var) = TAILQ_NEXT((var), field)) 5291ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 5301ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define TAILQ_FOREACH_SAFE(var, head, field, tvar) \ 5311ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen for ((var) = TAILQ_FIRST((head)); \ 5321ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (var) && ((tvar) = TAILQ_NEXT((var), field), 1); \ 5331ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (var) = (tvar)) 5341ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 5351ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define TAILQ_FOREACH_REVERSE(var, head, headname, field) \ 5361ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen for ((var) = TAILQ_LAST((head), headname); \ 5371ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (var); \ 5381ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (var) = TAILQ_PREV((var), headname, field)) 5391ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 5401ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define TAILQ_FOREACH_REVERSE_SAFE(var, head, headname, field, tvar) \ 5411ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen for ((var) = TAILQ_LAST((head), headname); \ 5421ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (var) && ((tvar) = TAILQ_PREV((var), headname, field), 1); \ 5431ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (var) = (tvar)) 5441ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 5451ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define TAILQ_INIT(head) do { \ 5461ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen TAILQ_FIRST((head)) = NULL; \ 5471ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (head)->tqh_last = &TAILQ_FIRST((head)); \ 5481ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen QMD_TRACE_HEAD(head); \ 5491ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen} while (0) 5501ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 5511ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define TAILQ_INSERT_AFTER(head, listelm, elm, field) do { \ 5521ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen QMD_TAILQ_CHECK_NEXT(listelm, field); \ 5531ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen if ((TAILQ_NEXT((elm), field) = TAILQ_NEXT((listelm), field)) != NULL)\ 5541ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen TAILQ_NEXT((elm), field)->field.tqe_prev = \ 5551ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen &TAILQ_NEXT((elm), field); \ 5561ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen else { \ 5571ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (head)->tqh_last = &TAILQ_NEXT((elm), field); \ 5581ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen QMD_TRACE_HEAD(head); \ 5591ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen } \ 5601ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen TAILQ_NEXT((listelm), field) = (elm); \ 5611ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (elm)->field.tqe_prev = &TAILQ_NEXT((listelm), field); \ 5621ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen QMD_TRACE_ELEM(&(elm)->field); \ 5631ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen QMD_TRACE_ELEM(&listelm->field); \ 5641ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen} while (0) 5651ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 5661ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define TAILQ_INSERT_BEFORE(listelm, elm, field) do { \ 5671ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen QMD_TAILQ_CHECK_PREV(listelm, field); \ 5681ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \ 5691ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen TAILQ_NEXT((elm), field) = (listelm); \ 5701ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen *(listelm)->field.tqe_prev = (elm); \ 5711ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (listelm)->field.tqe_prev = &TAILQ_NEXT((elm), field); \ 5721ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen QMD_TRACE_ELEM(&(elm)->field); \ 5731ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen QMD_TRACE_ELEM(&listelm->field); \ 5741ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen} while (0) 5751ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 5761ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define TAILQ_INSERT_HEAD(head, elm, field) do { \ 5771ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen QMD_TAILQ_CHECK_HEAD(head, field); \ 5781ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen if ((TAILQ_NEXT((elm), field) = TAILQ_FIRST((head))) != NULL) \ 5791ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen TAILQ_FIRST((head))->field.tqe_prev = \ 5801ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen &TAILQ_NEXT((elm), field); \ 5811ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen else \ 5821ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (head)->tqh_last = &TAILQ_NEXT((elm), field); \ 5831ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen TAILQ_FIRST((head)) = (elm); \ 5841ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (elm)->field.tqe_prev = &TAILQ_FIRST((head)); \ 5851ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen QMD_TRACE_HEAD(head); \ 5861ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen QMD_TRACE_ELEM(&(elm)->field); \ 5871ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen} while (0) 5881ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 5891ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define TAILQ_INSERT_TAIL(head, elm, field) do { \ 5901ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen QMD_TAILQ_CHECK_TAIL(head, field); \ 5911ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen TAILQ_NEXT((elm), field) = NULL; \ 5921ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (elm)->field.tqe_prev = (head)->tqh_last; \ 5931ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen *(head)->tqh_last = (elm); \ 5941ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (head)->tqh_last = &TAILQ_NEXT((elm), field); \ 5951ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen QMD_TRACE_HEAD(head); \ 5961ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen QMD_TRACE_ELEM(&(elm)->field); \ 5971ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen} while (0) 5981ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 5991ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define TAILQ_LAST(head, headname) \ 6001ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (*(((struct headname *)((head)->tqh_last))->tqh_last)) 6011ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 6021ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define TAILQ_NEXT(elm, field) ((elm)->field.tqe_next) 6031ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 6041ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define TAILQ_PREV(elm, headname, field) \ 6051ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last)) 6061ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 6071ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define TAILQ_REMOVE(head, elm, field) do { \ 6081ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen QMD_SAVELINK(oldnext, (elm)->field.tqe_next); \ 6091ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen QMD_SAVELINK(oldprev, (elm)->field.tqe_prev); \ 6101ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen QMD_TAILQ_CHECK_NEXT(elm, field); \ 6111ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen QMD_TAILQ_CHECK_PREV(elm, field); \ 6121ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen if ((TAILQ_NEXT((elm), field)) != NULL) \ 6131ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen TAILQ_NEXT((elm), field)->field.tqe_prev = \ 6141ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (elm)->field.tqe_prev; \ 6151ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen else { \ 6161ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (head)->tqh_last = (elm)->field.tqe_prev; \ 6171ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen QMD_TRACE_HEAD(head); \ 6181ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen } \ 6191ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen *(elm)->field.tqe_prev = TAILQ_NEXT((elm), field); \ 6201ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen TRASHIT(*oldnext); \ 6211ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen TRASHIT(*oldprev); \ 6221ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen QMD_TRACE_ELEM(&(elm)->field); \ 6231ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen} while (0) 6241ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 6251ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#define TAILQ_SWAP(head1, head2, type, field) do { \ 6261ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen struct type *swap_first = (head1)->tqh_first; \ 6271ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen struct type **swap_last = (head1)->tqh_last; \ 6281ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (head1)->tqh_first = (head2)->tqh_first; \ 6291ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (head1)->tqh_last = (head2)->tqh_last; \ 6301ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (head2)->tqh_first = swap_first; \ 6311ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (head2)->tqh_last = swap_last; \ 6321ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen if ((swap_first = (head1)->tqh_first) != NULL) \ 6331ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen swap_first->field.tqe_prev = &(head1)->tqh_first; \ 6341ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen else \ 6351ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (head1)->tqh_last = &(head1)->tqh_first; \ 6361ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen if ((swap_first = (head2)->tqh_first) != NULL) \ 6371ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen swap_first->field.tqe_prev = &(head2)->tqh_first; \ 6381ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen else \ 6391ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen (head2)->tqh_last = &(head2)->tqh_first; \ 6401ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen} while (0) 6411ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen 6421ffaf49b756f42a1f4f47b59f4b377a165c94a5etuexen#endif /* !_SYS_QUEUE_H_ */ 643