get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/71527/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 71527,
    "url": "http://patches.dpdk.org/api/patches/71527/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20200615004354.14380-9-dmitry.kozliuk@gmail.com/",
    "project": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<20200615004354.14380-9-dmitry.kozliuk@gmail.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20200615004354.14380-9-dmitry.kozliuk@gmail.com",
    "date": "2020-06-15T00:43:50",
    "name": "[v9,08/12] eal/windows: replace sys/queue.h with a complete one from FreeBSD",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "f0202b9de5255281075841881a5a2085eb9721e6",
    "submitter": {
        "id": 1581,
        "url": "http://patches.dpdk.org/api/people/1581/?format=api",
        "name": "Dmitry Kozlyuk",
        "email": "dmitry.kozliuk@gmail.com"
    },
    "delegate": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/users/1/?format=api",
        "username": "tmonjalo",
        "first_name": "Thomas",
        "last_name": "Monjalon",
        "email": "thomas@monjalon.net"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20200615004354.14380-9-dmitry.kozliuk@gmail.com/mbox/",
    "series": [
        {
            "id": 10455,
            "url": "http://patches.dpdk.org/api/series/10455/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=10455",
            "date": "2020-06-15T00:43:42",
            "name": "Windows basic memory management",
            "version": 9,
            "mbox": "http://patches.dpdk.org/series/10455/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/71527/comments/",
    "check": "fail",
    "checks": "http://patches.dpdk.org/api/patches/71527/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from dpdk.org (dpdk.org [92.243.14.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id E80D0A0093;\n\tMon, 15 Jun 2020 02:45:31 +0200 (CEST)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 40FCE14583;\n\tMon, 15 Jun 2020 02:44:34 +0200 (CEST)",
            "from mail-lj1-f196.google.com (mail-lj1-f196.google.com\n [209.85.208.196]) by dpdk.org (Postfix) with ESMTP id 2C9B84C8B\n for <dev@dpdk.org>; Mon, 15 Jun 2020 02:44:12 +0200 (CEST)",
            "by mail-lj1-f196.google.com with SMTP id s1so17106115ljo.0\n for <dev@dpdk.org>; Sun, 14 Jun 2020 17:44:12 -0700 (PDT)",
            "from localhost.localdomain (broadband-37-110-65-23.ip.moscow.rt.ru.\n [37.110.65.23])\n by smtp.gmail.com with ESMTPSA id f19sm4176342lfk.24.2020.06.14.17.44.10\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Sun, 14 Jun 2020 17:44:10 -0700 (PDT)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025;\n h=from:to:cc:subject:date:message-id:in-reply-to:references\n :mime-version:content-transfer-encoding;\n bh=WdapCNY9MaWPrRKKk1uJt6FgQa8jHQ2py3rwmwD8aaY=;\n b=UOi7bvYTj9SlFKdyimIVMnh0GtDQnsijI/JOSfDhrvt9LXj/vsbZvyLGiIWzfV4+HW\n cK83IuhRrNfhZf+Oms08Qsz2vAAKRZ3Hfm6qMdo0E39ijarvaCLmEEnxif3wDQZ+Ca1r\n WW36ODEHRCwmPnl1KftBbpFDpJBroYIrkKTzXqj2p7MVRiLVYEsvC4fGwLqV1JyCIYLv\n kAGyeOP0momaI8KsENWfmar4T1sCRcoKhXIsRuuiRRtbfbbQdPYZ1j4nBkTm1WaQlVvx\n N66teYdSTDubz3ithaiVdbXMSIPV1uc4cB7tynrIWshhdFLOpSdD1Og7+/q+XI/ZWTPA\n rudA==",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20161025;\n h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n :references:mime-version:content-transfer-encoding;\n bh=WdapCNY9MaWPrRKKk1uJt6FgQa8jHQ2py3rwmwD8aaY=;\n b=BMmEV8dfvTVfnsTIWAZA30/8FCCNgoMhjkkD/N1LS7BsbxJNN8dANlTKIH7bexBel2\n QP9Xy9rgjVUJm9XfJfO5K847DpV7PNmRUMUmhhpqMSld3yE8PA/S+Wi/KlQhGqifGevC\n JcVGtkRn5b14sYqOhzah+O8FVGUgVWgl3CgaQzVbP4BXdzxTz3UAmxZG5NOg1mFm5b8D\n L/cw/xm6r3Si6A7NWrht+64GCrUlrDtXWobF8hUajH1B5raTckUrNE3zVldp+1f0LWkz\n Cz4NNNw8xeN9aOmY8YMbfR/XyTsfLwMY5nd9yd4bY3opEWm+PfoOzHC5atnm6YBlEOfP\n 3KGQ==",
        "X-Gm-Message-State": "AOAM533X93Toar8kfpDxv5avNloJTuDF6iRMfNQyI49im1X1Axhtrnro\n W25JFqarbeSuUb2E+z/pQ/CdChN9O7sMyA==",
        "X-Google-Smtp-Source": "\n ABdhPJxlnnjAE9pvYV/imkHpbPvuXp23odM/SdzUH39djS35SfJ/ad6kKtNVxGSSyCrYT5unhMBwXg==",
        "X-Received": "by 2002:a05:651c:550:: with SMTP id\n q16mr9281428ljp.188.1592181851120;\n Sun, 14 Jun 2020 17:44:11 -0700 (PDT)",
        "From": "Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>",
        "To": "dev@dpdk.org",
        "Cc": "Dmitry Malloy <dmitrym@microsoft.com>,\n Narcisa Ana Maria Vasile <Narcisa.Vasile@microsoft.com>,\n Fady Bader <fady@mellanox.com>, Tal Shnaiderman <talshn@mellanox.com>,\n Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>,\n Harini Ramakrishnan <harini.ramakrishnan@microsoft.com>,\n Omar Cardona <ocardona@microsoft.com>,\n Pallavi Kadam <pallavi.kadam@intel.com>,\n Ranjit Menon <ranjit.menon@intel.com>",
        "Date": "Mon, 15 Jun 2020 03:43:50 +0300",
        "Message-Id": "<20200615004354.14380-9-dmitry.kozliuk@gmail.com>",
        "X-Mailer": "git-send-email 2.25.4",
        "In-Reply-To": "<20200615004354.14380-1-dmitry.kozliuk@gmail.com>",
        "References": "<20200610142730.31376-1-dmitry.kozliuk@gmail.com>\n <20200615004354.14380-1-dmitry.kozliuk@gmail.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[dpdk-dev] [PATCH v9 08/12] eal/windows: replace sys/queue.h with a\n\tcomplete one from FreeBSD",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "Limited version imported previously lacks at least SLIST macros.\nImport a complete file from FreeBSD, since its license exception is\nalready approved by Technical Board.\n\nSigned-off-by: Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>\n---\n lib/librte_eal/windows/include/sys/queue.h | 663 +++++++++++++++++++--\n 1 file changed, 601 insertions(+), 62 deletions(-)",
    "diff": "diff --git a/lib/librte_eal/windows/include/sys/queue.h b/lib/librte_eal/windows/include/sys/queue.h\nindex a65949a78..9756bee6f 100644\n--- a/lib/librte_eal/windows/include/sys/queue.h\n+++ b/lib/librte_eal/windows/include/sys/queue.h\n@@ -8,7 +8,36 @@\n #define\t_SYS_QUEUE_H_\n \n /*\n- * This file defines tail queues.\n+ * This file defines four types of data structures: singly-linked lists,\n+ * singly-linked tail queues, lists and tail queues.\n+ *\n+ * A singly-linked list is headed by a single forward pointer. The elements\n+ * are singly linked for minimum space and pointer manipulation overhead at\n+ * the expense of O(n) removal for arbitrary elements. New elements can be\n+ * added to the list after an existing element or at the head of the list.\n+ * Elements being removed from the head of the list should use the explicit\n+ * macro for this purpose for optimum efficiency. A singly-linked list may\n+ * only be traversed in the forward direction.  Singly-linked lists are ideal\n+ * for applications with large datasets and few or no removals or for\n+ * implementing a LIFO queue.\n+ *\n+ * A singly-linked tail queue is headed by a pair of pointers, one to the\n+ * head of the list and the other to the tail of the list. The elements are\n+ * singly linked for minimum space and pointer manipulation overhead at the\n+ * expense of O(n) removal for arbitrary elements. New elements can be added\n+ * to the list after an existing element, at the head of the list, or at the\n+ * end of the list. Elements being removed from the head of the tail queue\n+ * should use the explicit macro for this purpose for optimum efficiency.\n+ * A singly-linked tail queue may only be traversed in the forward direction.\n+ * Singly-linked tail queues are ideal for applications with large datasets\n+ * and few or no removals or for implementing a FIFO queue.\n+ *\n+ * A list is headed by a single forward pointer (or an array of forward\n+ * pointers for a hash table header). The elements are doubly linked\n+ * so that an arbitrary element can be removed without a need to\n+ * traverse the list. New elements can be added to the list before\n+ * or after an existing element or at the head of the list. A list\n+ * may be traversed in either direction.\n  *\n  * A tail queue is headed by a pair of pointers, one to the head of the\n  * list and the other to the tail of the list. The elements are doubly\n@@ -17,65 +46,93 @@\n  * after an existing element, at the head of the list, or at the end of\n  * the list. A tail queue may be traversed in either direction.\n  *\n+ * For details on the use of these macros, see the queue(3) manual page.\n+ *\n  * Below is a summary of implemented functions where:\n  *  +  means the macro is available\n  *  -  means the macro is not available\n  *  s  means the macro is available but is slow (runs in O(n) time)\n  *\n- *\t\t\t\tTAILQ\n- * _HEAD\t\t\t+\n- * _CLASS_HEAD\t\t\t+\n- * _HEAD_INITIALIZER\t\t+\n- * _ENTRY\t\t\t+\n- * _CLASS_ENTRY\t\t\t+\n- * _INIT\t\t\t+\n- * _EMPTY\t\t\t+\n- * _FIRST\t\t\t+\n- * _NEXT\t\t\t+\n- * _PREV\t\t\t+\n- * _LAST\t\t\t+\n- * _LAST_FAST\t\t\t+\n- * _FOREACH\t\t\t+\n- * _FOREACH_FROM\t\t+\n- * _FOREACH_SAFE\t\t+\n- * _FOREACH_FROM_SAFE\t\t+\n- * _FOREACH_REVERSE\t\t+\n- * _FOREACH_REVERSE_FROM\t+\n- * _FOREACH_REVERSE_SAFE\t+\n- * _FOREACH_REVERSE_FROM_SAFE\t+\n- * _INSERT_HEAD\t\t\t+\n- * _INSERT_BEFORE\t\t+\n- * _INSERT_AFTER\t\t+\n- * _INSERT_TAIL\t\t\t+\n- * _CONCAT\t\t\t+\n- * _REMOVE_AFTER\t\t-\n- * _REMOVE_HEAD\t\t\t-\n- * _REMOVE\t\t\t+\n- * _SWAP\t\t\t+\n+ *\t\t\t\tSLIST\tLIST\tSTAILQ\tTAILQ\n+ * _HEAD\t\t\t+\t+\t+\t+\n+ * _CLASS_HEAD\t\t\t+\t+\t+\t+\n+ * _HEAD_INITIALIZER\t\t+\t+\t+\t+\n+ * _ENTRY\t\t\t+\t+\t+\t+\n+ * _CLASS_ENTRY\t\t\t+\t+\t+\t+\n+ * _INIT\t\t\t+\t+\t+\t+\n+ * _EMPTY\t\t\t+\t+\t+\t+\n+ * _FIRST\t\t\t+\t+\t+\t+\n+ * _NEXT\t\t\t+\t+\t+\t+\n+ * _PREV\t\t\t-\t+\t-\t+\n+ * _LAST\t\t\t-\t-\t+\t+\n+ * _LAST_FAST\t\t\t-\t-\t-\t+\n+ * _FOREACH\t\t\t+\t+\t+\t+\n+ * _FOREACH_FROM\t\t+\t+\t+\t+\n+ * _FOREACH_SAFE\t\t+\t+\t+\t+\n+ * _FOREACH_FROM_SAFE\t\t+\t+\t+\t+\n+ * _FOREACH_REVERSE\t\t-\t-\t-\t+\n+ * _FOREACH_REVERSE_FROM\t-\t-\t-\t+\n+ * _FOREACH_REVERSE_SAFE\t-\t-\t-\t+\n+ * _FOREACH_REVERSE_FROM_SAFE\t-\t-\t-\t+\n+ * _INSERT_HEAD\t\t\t+\t+\t+\t+\n+ * _INSERT_BEFORE\t\t-\t+\t-\t+\n+ * _INSERT_AFTER\t\t+\t+\t+\t+\n+ * _INSERT_TAIL\t\t\t-\t-\t+\t+\n+ * _CONCAT\t\t\ts\ts\t+\t+\n+ * _REMOVE_AFTER\t\t+\t-\t+\t-\n+ * _REMOVE_HEAD\t\t\t+\t-\t+\t-\n+ * _REMOVE\t\t\ts\t+\ts\t+\n+ * _SWAP\t\t\t+\t+\t+\t+\n  *\n  */\n-\n-#ifdef __cplusplus\n-extern \"C\" {\n+#ifdef QUEUE_MACRO_DEBUG\n+#warn Use QUEUE_MACRO_DEBUG_TRACE and/or QUEUE_MACRO_DEBUG_TRASH\n+#define\tQUEUE_MACRO_DEBUG_TRACE\n+#define\tQUEUE_MACRO_DEBUG_TRASH\n #endif\n \n-/*\n- * List definitions.\n- */\n-#define\tLIST_HEAD(name, type)\t\t\t\t\t\t\\\n-struct name {\t\t\t\t\t\t\t\t\\\n-\tstruct type *lh_first;\t/* first element */\t\t\t\\\n-}\n+#ifdef QUEUE_MACRO_DEBUG_TRACE\n+/* Store the last 2 places the queue element or head was altered */\n+struct qm_trace {\n+\tunsigned long\t lastline;\n+\tunsigned long\t prevline;\n+\tconst char\t*lastfile;\n+\tconst char\t*prevfile;\n+};\n+\n+#define\tTRACEBUF\tstruct qm_trace trace;\n+#define\tTRACEBUF_INITIALIZER\t{ __LINE__, 0, __FILE__, NULL } ,\n+\n+#define\tQMD_TRACE_HEAD(head) do {\t\t\t\t\t\\\n+\t(head)->trace.prevline = (head)->trace.lastline;\t\t\\\n+\t(head)->trace.prevfile = (head)->trace.lastfile;\t\t\\\n+\t(head)->trace.lastline = __LINE__;\t\t\t\t\\\n+\t(head)->trace.lastfile = __FILE__;\t\t\t\t\\\n+} while (0)\n \n+#define\tQMD_TRACE_ELEM(elem) do {\t\t\t\t\t\\\n+\t(elem)->trace.prevline = (elem)->trace.lastline;\t\t\\\n+\t(elem)->trace.prevfile = (elem)->trace.lastfile;\t\t\\\n+\t(elem)->trace.lastline = __LINE__;\t\t\t\t\\\n+\t(elem)->trace.lastfile = __FILE__;\t\t\t\t\\\n+} while (0)\n+\n+#else\t/* !QUEUE_MACRO_DEBUG_TRACE */\n #define\tQMD_TRACE_ELEM(elem)\n #define\tQMD_TRACE_HEAD(head)\n #define\tTRACEBUF\n #define\tTRACEBUF_INITIALIZER\n+#endif\t/* QUEUE_MACRO_DEBUG_TRACE */\n \n+#ifdef QUEUE_MACRO_DEBUG_TRASH\n+#define\tQMD_SAVELINK(name, link)\tvoid **name = (void *)&(link)\n+#define\tTRASHIT(x)\t\tdo {(x) = (void *)-1;} while (0)\n+#define\tQMD_IS_TRASHED(x)\t((x) == (void *)(intptr_t)-1)\n+#else\t/* !QUEUE_MACRO_DEBUG_TRASH */\n+#define\tQMD_SAVELINK(name, link)\n #define\tTRASHIT(x)\n #define\tQMD_IS_TRASHED(x)\t0\n-\n-#define\tQMD_SAVELINK(name, link)\n+#endif\t/* QUEUE_MACRO_DEBUG_TRASH */\n \n #ifdef __cplusplus\n /*\n@@ -86,6 +143,445 @@ struct name {\t\t\t\t\t\t\t\t\\\n #define\tQUEUE_TYPEOF(type) struct type\n #endif\n \n+/*\n+ * Singly-linked List declarations.\n+ */\n+#define\tSLIST_HEAD(name, type)\t\t\t\t\t\t\\\n+struct name {\t\t\t\t\t\t\t\t\\\n+\tstruct type *slh_first;\t/* first element */\t\t\t\\\n+}\n+\n+#define\tSLIST_CLASS_HEAD(name, type)\t\t\t\t\t\\\n+struct name {\t\t\t\t\t\t\t\t\\\n+\tclass type *slh_first;\t/* first element */\t\t\t\\\n+}\n+\n+#define\tSLIST_HEAD_INITIALIZER(head)\t\t\t\t\t\\\n+\t{ NULL }\n+\n+#define\tSLIST_ENTRY(type)\t\t\t\t\t\t\\\n+struct {\t\t\t\t\t\t\t\t\\\n+\tstruct type *sle_next;\t/* next element */\t\t\t\\\n+}\n+\n+#define\tSLIST_CLASS_ENTRY(type)\t\t\t\t\t\t\\\n+struct {\t\t\t\t\t\t\t\t\\\n+\tclass type *sle_next;\t\t/* next element */\t\t\\\n+}\n+\n+/*\n+ * Singly-linked List functions.\n+ */\n+#if (defined(_KERNEL) && defined(INVARIANTS))\n+#define\tQMD_SLIST_CHECK_PREVPTR(prevp, elm) do {\t\t\t\\\n+\tif (*(prevp) != (elm))\t\t\t\t\t\t\\\n+\t\tpanic(\"Bad prevptr *(%p) == %p != %p\",\t\t\t\\\n+\t\t    (prevp), *(prevp), (elm));\t\t\t\t\\\n+} while (0)\n+#else\n+#define\tQMD_SLIST_CHECK_PREVPTR(prevp, elm)\n+#endif\n+\n+#define SLIST_CONCAT(head1, head2, type, field) do {\t\t\t\\\n+\tQUEUE_TYPEOF(type) *curelm = SLIST_FIRST(head1);\t\t\\\n+\tif (curelm == NULL) {\t\t\t\t\t\t\\\n+\t\tif ((SLIST_FIRST(head1) = SLIST_FIRST(head2)) != NULL)\t\\\n+\t\t\tSLIST_INIT(head2);\t\t\t\t\\\n+\t} else if (SLIST_FIRST(head2) != NULL) {\t\t\t\\\n+\t\twhile (SLIST_NEXT(curelm, field) != NULL)\t\t\\\n+\t\t\tcurelm = SLIST_NEXT(curelm, field);\t\t\\\n+\t\tSLIST_NEXT(curelm, field) = SLIST_FIRST(head2);\t\t\\\n+\t\tSLIST_INIT(head2);\t\t\t\t\t\\\n+\t}\t\t\t\t\t\t\t\t\\\n+} while (0)\n+\n+#define\tSLIST_EMPTY(head)\t((head)->slh_first == NULL)\n+\n+#define\tSLIST_FIRST(head)\t((head)->slh_first)\n+\n+#define\tSLIST_FOREACH(var, head, field)\t\t\t\t\t\\\n+\tfor ((var) = SLIST_FIRST((head));\t\t\t\t\\\n+\t    (var);\t\t\t\t\t\t\t\\\n+\t    (var) = SLIST_NEXT((var), field))\n+\n+#define\tSLIST_FOREACH_FROM(var, head, field)\t\t\t\t\\\n+\tfor ((var) = ((var) ? (var) : SLIST_FIRST((head)));\t\t\\\n+\t    (var);\t\t\t\t\t\t\t\\\n+\t    (var) = SLIST_NEXT((var), field))\n+\n+#define\tSLIST_FOREACH_SAFE(var, head, field, tvar)\t\t\t\\\n+\tfor ((var) = SLIST_FIRST((head));\t\t\t\t\\\n+\t    (var) && ((tvar) = SLIST_NEXT((var), field), 1);\t\t\\\n+\t    (var) = (tvar))\n+\n+#define\tSLIST_FOREACH_FROM_SAFE(var, head, field, tvar)\t\t\t\\\n+\tfor ((var) = ((var) ? (var) : SLIST_FIRST((head)));\t\t\\\n+\t    (var) && ((tvar) = SLIST_NEXT((var), field), 1);\t\t\\\n+\t    (var) = (tvar))\n+\n+#define\tSLIST_FOREACH_PREVPTR(var, varp, head, field)\t\t\t\\\n+\tfor ((varp) = &SLIST_FIRST((head));\t\t\t\t\\\n+\t    ((var) = *(varp)) != NULL;\t\t\t\t\t\\\n+\t    (varp) = &SLIST_NEXT((var), field))\n+\n+#define\tSLIST_INIT(head) do {\t\t\t\t\t\t\\\n+\tSLIST_FIRST((head)) = NULL;\t\t\t\t\t\\\n+} while (0)\n+\n+#define\tSLIST_INSERT_AFTER(slistelm, elm, field) do {\t\t\t\\\n+\tSLIST_NEXT((elm), field) = SLIST_NEXT((slistelm), field);\t\\\n+\tSLIST_NEXT((slistelm), field) = (elm);\t\t\t\t\\\n+} while (0)\n+\n+#define\tSLIST_INSERT_HEAD(head, elm, field) do {\t\t\t\\\n+\tSLIST_NEXT((elm), field) = SLIST_FIRST((head));\t\t\t\\\n+\tSLIST_FIRST((head)) = (elm);\t\t\t\t\t\\\n+} while (0)\n+\n+#define\tSLIST_NEXT(elm, field)\t((elm)->field.sle_next)\n+\n+#define\tSLIST_REMOVE(head, elm, type, field) do {\t\t\t\\\n+\tQMD_SAVELINK(oldnext, (elm)->field.sle_next);\t\t\t\\\n+\tif (SLIST_FIRST((head)) == (elm)) {\t\t\t\t\\\n+\t\tSLIST_REMOVE_HEAD((head), field);\t\t\t\\\n+\t}\t\t\t\t\t\t\t\t\\\n+\telse {\t\t\t\t\t\t\t\t\\\n+\t\tQUEUE_TYPEOF(type) *curelm = SLIST_FIRST(head);\t\t\\\n+\t\twhile (SLIST_NEXT(curelm, field) != (elm))\t\t\\\n+\t\t\tcurelm = SLIST_NEXT(curelm, field);\t\t\\\n+\t\tSLIST_REMOVE_AFTER(curelm, field);\t\t\t\\\n+\t}\t\t\t\t\t\t\t\t\\\n+\tTRASHIT(*oldnext);\t\t\t\t\t\t\\\n+} while (0)\n+\n+#define SLIST_REMOVE_AFTER(elm, field) do {\t\t\t\t\\\n+\tSLIST_NEXT(elm, field) =\t\t\t\t\t\\\n+\t    SLIST_NEXT(SLIST_NEXT(elm, field), field);\t\t\t\\\n+} while (0)\n+\n+#define\tSLIST_REMOVE_HEAD(head, field) do {\t\t\t\t\\\n+\tSLIST_FIRST((head)) = SLIST_NEXT(SLIST_FIRST((head)), field);\t\\\n+} while (0)\n+\n+#define\tSLIST_REMOVE_PREVPTR(prevp, elm, field) do {\t\t\t\\\n+\tQMD_SLIST_CHECK_PREVPTR(prevp, elm);\t\t\t\t\\\n+\t*(prevp) = SLIST_NEXT(elm, field);\t\t\t\t\\\n+\tTRASHIT((elm)->field.sle_next);\t\t\t\t\t\\\n+} while (0)\n+\n+#define SLIST_SWAP(head1, head2, type) do {\t\t\t\t\\\n+\tQUEUE_TYPEOF(type) *swap_first = SLIST_FIRST(head1);\t\t\\\n+\tSLIST_FIRST(head1) = SLIST_FIRST(head2);\t\t\t\\\n+\tSLIST_FIRST(head2) = swap_first;\t\t\t\t\\\n+} while (0)\n+\n+/*\n+ * Singly-linked Tail queue declarations.\n+ */\n+#define\tSTAILQ_HEAD(name, type)\t\t\t\t\t\t\\\n+struct name {\t\t\t\t\t\t\t\t\\\n+\tstruct type *stqh_first;/* first element */\t\t\t\\\n+\tstruct type **stqh_last;/* addr of last next element */\t\t\\\n+}\n+\n+#define\tSTAILQ_CLASS_HEAD(name, type)\t\t\t\t\t\\\n+struct name {\t\t\t\t\t\t\t\t\\\n+\tclass type *stqh_first;\t/* first element */\t\t\t\\\n+\tclass type **stqh_last;\t/* addr of last next element */\t\t\\\n+}\n+\n+#define\tSTAILQ_HEAD_INITIALIZER(head)\t\t\t\t\t\\\n+\t{ NULL, &(head).stqh_first }\n+\n+#define\tSTAILQ_ENTRY(type)\t\t\t\t\t\t\\\n+struct {\t\t\t\t\t\t\t\t\\\n+\tstruct type *stqe_next;\t/* next element */\t\t\t\\\n+}\n+\n+#define\tSTAILQ_CLASS_ENTRY(type)\t\t\t\t\t\\\n+struct {\t\t\t\t\t\t\t\t\\\n+\tclass type *stqe_next;\t/* next element */\t\t\t\\\n+}\n+\n+/*\n+ * Singly-linked Tail queue functions.\n+ */\n+#define\tSTAILQ_CONCAT(head1, head2) do {\t\t\t\t\\\n+\tif (!STAILQ_EMPTY((head2))) {\t\t\t\t\t\\\n+\t\t*(head1)->stqh_last = (head2)->stqh_first;\t\t\\\n+\t\t(head1)->stqh_last = (head2)->stqh_last;\t\t\\\n+\t\tSTAILQ_INIT((head2));\t\t\t\t\t\\\n+\t}\t\t\t\t\t\t\t\t\\\n+} while (0)\n+\n+#define\tSTAILQ_EMPTY(head)\t((head)->stqh_first == NULL)\n+\n+#define\tSTAILQ_FIRST(head)\t((head)->stqh_first)\n+\n+#define\tSTAILQ_FOREACH(var, head, field)\t\t\t\t\\\n+\tfor((var) = STAILQ_FIRST((head));\t\t\t\t\\\n+\t   (var);\t\t\t\t\t\t\t\\\n+\t   (var) = STAILQ_NEXT((var), field))\n+\n+#define\tSTAILQ_FOREACH_FROM(var, head, field)\t\t\t\t\\\n+\tfor ((var) = ((var) ? (var) : STAILQ_FIRST((head)));\t\t\\\n+\t   (var);\t\t\t\t\t\t\t\\\n+\t   (var) = STAILQ_NEXT((var), field))\n+\n+#define\tSTAILQ_FOREACH_SAFE(var, head, field, tvar)\t\t\t\\\n+\tfor ((var) = STAILQ_FIRST((head));\t\t\t\t\\\n+\t    (var) && ((tvar) = STAILQ_NEXT((var), field), 1);\t\t\\\n+\t    (var) = (tvar))\n+\n+#define\tSTAILQ_FOREACH_FROM_SAFE(var, head, field, tvar)\t\t\\\n+\tfor ((var) = ((var) ? (var) : STAILQ_FIRST((head)));\t\t\\\n+\t    (var) && ((tvar) = STAILQ_NEXT((var), field), 1);\t\t\\\n+\t    (var) = (tvar))\n+\n+#define\tSTAILQ_INIT(head) do {\t\t\t\t\t\t\\\n+\tSTAILQ_FIRST((head)) = NULL;\t\t\t\t\t\\\n+\t(head)->stqh_last = &STAILQ_FIRST((head));\t\t\t\\\n+} while (0)\n+\n+#define\tSTAILQ_INSERT_AFTER(head, tqelm, elm, field) do {\t\t\\\n+\tif ((STAILQ_NEXT((elm), field) = STAILQ_NEXT((tqelm), field)) == NULL)\\\n+\t\t(head)->stqh_last = &STAILQ_NEXT((elm), field);\t\t\\\n+\tSTAILQ_NEXT((tqelm), field) = (elm);\t\t\t\t\\\n+} while (0)\n+\n+#define\tSTAILQ_INSERT_HEAD(head, elm, field) do {\t\t\t\\\n+\tif ((STAILQ_NEXT((elm), field) = STAILQ_FIRST((head))) == NULL)\t\\\n+\t\t(head)->stqh_last = &STAILQ_NEXT((elm), field);\t\t\\\n+\tSTAILQ_FIRST((head)) = (elm);\t\t\t\t\t\\\n+} while (0)\n+\n+#define\tSTAILQ_INSERT_TAIL(head, elm, field) do {\t\t\t\\\n+\tSTAILQ_NEXT((elm), field) = NULL;\t\t\t\t\\\n+\t*(head)->stqh_last = (elm);\t\t\t\t\t\\\n+\t(head)->stqh_last = &STAILQ_NEXT((elm), field);\t\t\t\\\n+} while (0)\n+\n+#define\tSTAILQ_LAST(head, type, field)\t\t\t\t\\\n+\t(STAILQ_EMPTY((head)) ? NULL :\t\t\t\t\\\n+\t    __containerof((head)->stqh_last,\t\t\t\\\n+\t    QUEUE_TYPEOF(type), field.stqe_next))\n+\n+#define\tSTAILQ_NEXT(elm, field)\t((elm)->field.stqe_next)\n+\n+#define\tSTAILQ_REMOVE(head, elm, type, field) do {\t\t\t\\\n+\tQMD_SAVELINK(oldnext, (elm)->field.stqe_next);\t\t\t\\\n+\tif (STAILQ_FIRST((head)) == (elm)) {\t\t\t\t\\\n+\t\tSTAILQ_REMOVE_HEAD((head), field);\t\t\t\\\n+\t}\t\t\t\t\t\t\t\t\\\n+\telse {\t\t\t\t\t\t\t\t\\\n+\t\tQUEUE_TYPEOF(type) *curelm = STAILQ_FIRST(head);\t\\\n+\t\twhile (STAILQ_NEXT(curelm, field) != (elm))\t\t\\\n+\t\t\tcurelm = STAILQ_NEXT(curelm, field);\t\t\\\n+\t\tSTAILQ_REMOVE_AFTER(head, curelm, field);\t\t\\\n+\t}\t\t\t\t\t\t\t\t\\\n+\tTRASHIT(*oldnext);\t\t\t\t\t\t\\\n+} while (0)\n+\n+#define STAILQ_REMOVE_AFTER(head, elm, field) do {\t\t\t\\\n+\tif ((STAILQ_NEXT(elm, field) =\t\t\t\t\t\\\n+\t     STAILQ_NEXT(STAILQ_NEXT(elm, field), field)) == NULL)\t\\\n+\t\t(head)->stqh_last = &STAILQ_NEXT((elm), field);\t\t\\\n+} while (0)\n+\n+#define\tSTAILQ_REMOVE_HEAD(head, field) do {\t\t\t\t\\\n+\tif ((STAILQ_FIRST((head)) =\t\t\t\t\t\\\n+\t     STAILQ_NEXT(STAILQ_FIRST((head)), field)) == NULL)\t\t\\\n+\t\t(head)->stqh_last = &STAILQ_FIRST((head));\t\t\\\n+} while (0)\n+\n+#define STAILQ_SWAP(head1, head2, type) do {\t\t\t\t\\\n+\tQUEUE_TYPEOF(type) *swap_first = STAILQ_FIRST(head1);\t\t\\\n+\tQUEUE_TYPEOF(type) **swap_last = (head1)->stqh_last;\t\t\\\n+\tSTAILQ_FIRST(head1) = STAILQ_FIRST(head2);\t\t\t\\\n+\t(head1)->stqh_last = (head2)->stqh_last;\t\t\t\\\n+\tSTAILQ_FIRST(head2) = swap_first;\t\t\t\t\\\n+\t(head2)->stqh_last = swap_last;\t\t\t\t\t\\\n+\tif (STAILQ_EMPTY(head1))\t\t\t\t\t\\\n+\t\t(head1)->stqh_last = &STAILQ_FIRST(head1);\t\t\\\n+\tif (STAILQ_EMPTY(head2))\t\t\t\t\t\\\n+\t\t(head2)->stqh_last = &STAILQ_FIRST(head2);\t\t\\\n+} while (0)\n+\n+\n+/*\n+ * List declarations.\n+ */\n+#define\tLIST_HEAD(name, type)\t\t\t\t\t\t\\\n+struct name {\t\t\t\t\t\t\t\t\\\n+\tstruct type *lh_first;\t/* first element */\t\t\t\\\n+}\n+\n+#define\tLIST_CLASS_HEAD(name, type)\t\t\t\t\t\\\n+struct name {\t\t\t\t\t\t\t\t\\\n+\tclass type *lh_first;\t/* first element */\t\t\t\\\n+}\n+\n+#define\tLIST_HEAD_INITIALIZER(head)\t\t\t\t\t\\\n+\t{ NULL }\n+\n+#define\tLIST_ENTRY(type)\t\t\t\t\t\t\\\n+struct {\t\t\t\t\t\t\t\t\\\n+\tstruct type *le_next;\t/* next element */\t\t\t\\\n+\tstruct type **le_prev;\t/* address of previous next element */\t\\\n+}\n+\n+#define\tLIST_CLASS_ENTRY(type)\t\t\t\t\t\t\\\n+struct {\t\t\t\t\t\t\t\t\\\n+\tclass type *le_next;\t/* next element */\t\t\t\\\n+\tclass type **le_prev;\t/* address of previous next element */\t\\\n+}\n+\n+/*\n+ * List functions.\n+ */\n+\n+#if (defined(_KERNEL) && defined(INVARIANTS))\n+/*\n+ * QMD_LIST_CHECK_HEAD(LIST_HEAD *head, LIST_ENTRY NAME)\n+ *\n+ * If the list is non-empty, validates that the first element of the list\n+ * points back at 'head.'\n+ */\n+#define\tQMD_LIST_CHECK_HEAD(head, field) do {\t\t\t\t\\\n+\tif (LIST_FIRST((head)) != NULL &&\t\t\t\t\\\n+\t    LIST_FIRST((head))->field.le_prev !=\t\t\t\\\n+\t     &LIST_FIRST((head)))\t\t\t\t\t\\\n+\t\tpanic(\"Bad list head %p first->prev != head\", (head));\t\\\n+} while (0)\n+\n+/*\n+ * QMD_LIST_CHECK_NEXT(TYPE *elm, LIST_ENTRY NAME)\n+ *\n+ * If an element follows 'elm' in the list, validates that the next element\n+ * points back at 'elm.'\n+ */\n+#define\tQMD_LIST_CHECK_NEXT(elm, field) do {\t\t\t\t\\\n+\tif (LIST_NEXT((elm), field) != NULL &&\t\t\t\t\\\n+\t    LIST_NEXT((elm), field)->field.le_prev !=\t\t\t\\\n+\t     &((elm)->field.le_next))\t\t\t\t\t\\\n+\t     \tpanic(\"Bad link elm %p next->prev != elm\", (elm));\t\\\n+} while (0)\n+\n+/*\n+ * QMD_LIST_CHECK_PREV(TYPE *elm, LIST_ENTRY NAME)\n+ *\n+ * Validates that the previous element (or head of the list) points to 'elm.'\n+ */\n+#define\tQMD_LIST_CHECK_PREV(elm, field) do {\t\t\t\t\\\n+\tif (*(elm)->field.le_prev != (elm))\t\t\t\t\\\n+\t\tpanic(\"Bad link elm %p prev->next != elm\", (elm));\t\\\n+} while (0)\n+#else\n+#define\tQMD_LIST_CHECK_HEAD(head, field)\n+#define\tQMD_LIST_CHECK_NEXT(elm, field)\n+#define\tQMD_LIST_CHECK_PREV(elm, field)\n+#endif /* (_KERNEL && INVARIANTS) */\n+\n+#define LIST_CONCAT(head1, head2, type, field) do {\t\t\t      \\\n+\tQUEUE_TYPEOF(type) *curelm = LIST_FIRST(head1);\t\t\t      \\\n+\tif (curelm == NULL) {\t\t\t\t\t\t      \\\n+\t\tif ((LIST_FIRST(head1) = LIST_FIRST(head2)) != NULL) {\t      \\\n+\t\t\tLIST_FIRST(head2)->field.le_prev =\t\t      \\\n+\t\t\t    &LIST_FIRST((head1));\t\t\t      \\\n+\t\t\tLIST_INIT(head2);\t\t\t\t      \\\n+\t\t}\t\t\t\t\t\t\t      \\\n+\t} else if (LIST_FIRST(head2) != NULL) {\t\t\t\t      \\\n+\t\twhile (LIST_NEXT(curelm, field) != NULL)\t\t      \\\n+\t\t\tcurelm = LIST_NEXT(curelm, field);\t\t      \\\n+\t\tLIST_NEXT(curelm, field) = LIST_FIRST(head2);\t\t      \\\n+\t\tLIST_FIRST(head2)->field.le_prev = &LIST_NEXT(curelm, field); \\\n+\t\tLIST_INIT(head2);\t\t\t\t\t      \\\n+\t}\t\t\t\t\t\t\t\t      \\\n+} while (0)\n+\n+#define\tLIST_EMPTY(head)\t((head)->lh_first == NULL)\n+\n+#define\tLIST_FIRST(head)\t((head)->lh_first)\n+\n+#define\tLIST_FOREACH(var, head, field)\t\t\t\t\t\\\n+\tfor ((var) = LIST_FIRST((head));\t\t\t\t\\\n+\t    (var);\t\t\t\t\t\t\t\\\n+\t    (var) = LIST_NEXT((var), field))\n+\n+#define\tLIST_FOREACH_FROM(var, head, field)\t\t\t\t\\\n+\tfor ((var) = ((var) ? (var) : LIST_FIRST((head)));\t\t\\\n+\t    (var);\t\t\t\t\t\t\t\\\n+\t    (var) = LIST_NEXT((var), field))\n+\n+#define\tLIST_FOREACH_SAFE(var, head, field, tvar)\t\t\t\\\n+\tfor ((var) = LIST_FIRST((head));\t\t\t\t\\\n+\t    (var) && ((tvar) = LIST_NEXT((var), field), 1);\t\t\\\n+\t    (var) = (tvar))\n+\n+#define\tLIST_FOREACH_FROM_SAFE(var, head, field, tvar)\t\t\t\\\n+\tfor ((var) = ((var) ? (var) : LIST_FIRST((head)));\t\t\\\n+\t    (var) && ((tvar) = LIST_NEXT((var), field), 1);\t\t\\\n+\t    (var) = (tvar))\n+\n+#define\tLIST_INIT(head) do {\t\t\t\t\t\t\\\n+\tLIST_FIRST((head)) = NULL;\t\t\t\t\t\\\n+} while (0)\n+\n+#define\tLIST_INSERT_AFTER(listelm, elm, field) do {\t\t\t\\\n+\tQMD_LIST_CHECK_NEXT(listelm, field);\t\t\t\t\\\n+\tif ((LIST_NEXT((elm), field) = LIST_NEXT((listelm), field)) != NULL)\\\n+\t\tLIST_NEXT((listelm), field)->field.le_prev =\t\t\\\n+\t\t    &LIST_NEXT((elm), field);\t\t\t\t\\\n+\tLIST_NEXT((listelm), field) = (elm);\t\t\t\t\\\n+\t(elm)->field.le_prev = &LIST_NEXT((listelm), field);\t\t\\\n+} while (0)\n+\n+#define\tLIST_INSERT_BEFORE(listelm, elm, field) do {\t\t\t\\\n+\tQMD_LIST_CHECK_PREV(listelm, field);\t\t\t\t\\\n+\t(elm)->field.le_prev = (listelm)->field.le_prev;\t\t\\\n+\tLIST_NEXT((elm), field) = (listelm);\t\t\t\t\\\n+\t*(listelm)->field.le_prev = (elm);\t\t\t\t\\\n+\t(listelm)->field.le_prev = &LIST_NEXT((elm), field);\t\t\\\n+} while (0)\n+\n+#define\tLIST_INSERT_HEAD(head, elm, field) do {\t\t\t\t\\\n+\tQMD_LIST_CHECK_HEAD((head), field);\t\t\t\t\\\n+\tif ((LIST_NEXT((elm), field) = LIST_FIRST((head))) != NULL)\t\\\n+\t\tLIST_FIRST((head))->field.le_prev = &LIST_NEXT((elm), field);\\\n+\tLIST_FIRST((head)) = (elm);\t\t\t\t\t\\\n+\t(elm)->field.le_prev = &LIST_FIRST((head));\t\t\t\\\n+} while (0)\n+\n+#define\tLIST_NEXT(elm, field)\t((elm)->field.le_next)\n+\n+#define\tLIST_PREV(elm, head, type, field)\t\t\t\\\n+\t((elm)->field.le_prev == &LIST_FIRST((head)) ? NULL :\t\\\n+\t    __containerof((elm)->field.le_prev,\t\t\t\\\n+\t    QUEUE_TYPEOF(type), field.le_next))\n+\n+#define\tLIST_REMOVE(elm, field) do {\t\t\t\t\t\\\n+\tQMD_SAVELINK(oldnext, (elm)->field.le_next);\t\t\t\\\n+\tQMD_SAVELINK(oldprev, (elm)->field.le_prev);\t\t\t\\\n+\tQMD_LIST_CHECK_NEXT(elm, field);\t\t\t\t\\\n+\tQMD_LIST_CHECK_PREV(elm, field);\t\t\t\t\\\n+\tif (LIST_NEXT((elm), field) != NULL)\t\t\t\t\\\n+\t\tLIST_NEXT((elm), field)->field.le_prev = \t\t\\\n+\t\t    (elm)->field.le_prev;\t\t\t\t\\\n+\t*(elm)->field.le_prev = LIST_NEXT((elm), field);\t\t\\\n+\tTRASHIT(*oldnext);\t\t\t\t\t\t\\\n+\tTRASHIT(*oldprev);\t\t\t\t\t\t\\\n+} while (0)\n+\n+#define LIST_SWAP(head1, head2, type, field) do {\t\t\t\\\n+\tQUEUE_TYPEOF(type) *swap_tmp = LIST_FIRST(head1);\t\t\\\n+\tLIST_FIRST((head1)) = LIST_FIRST((head2));\t\t\t\\\n+\tLIST_FIRST((head2)) = swap_tmp;\t\t\t\t\t\\\n+\tif ((swap_tmp = LIST_FIRST((head1))) != NULL)\t\t\t\\\n+\t\tswap_tmp->field.le_prev = &LIST_FIRST((head1));\t\t\\\n+\tif ((swap_tmp = LIST_FIRST((head2))) != NULL)\t\t\t\\\n+\t\tswap_tmp->field.le_prev = &LIST_FIRST((head2));\t\t\\\n+} while (0)\n+\n /*\n  * Tail queue declarations.\n  */\n@@ -123,10 +619,58 @@ struct {\t\t\t\t\t\t\t\t\\\n /*\n  * Tail queue functions.\n  */\n+#if (defined(_KERNEL) && defined(INVARIANTS))\n+/*\n+ * QMD_TAILQ_CHECK_HEAD(TAILQ_HEAD *head, TAILQ_ENTRY NAME)\n+ *\n+ * If the tailq is non-empty, validates that the first element of the tailq\n+ * points back at 'head.'\n+ */\n+#define\tQMD_TAILQ_CHECK_HEAD(head, field) do {\t\t\t\t\\\n+\tif (!TAILQ_EMPTY(head) &&\t\t\t\t\t\\\n+\t    TAILQ_FIRST((head))->field.tqe_prev !=\t\t\t\\\n+\t     &TAILQ_FIRST((head)))\t\t\t\t\t\\\n+\t\tpanic(\"Bad tailq head %p first->prev != head\", (head));\t\\\n+} while (0)\n+\n+/*\n+ * QMD_TAILQ_CHECK_TAIL(TAILQ_HEAD *head, TAILQ_ENTRY NAME)\n+ *\n+ * Validates that the tail of the tailq is a pointer to pointer to NULL.\n+ */\n+#define\tQMD_TAILQ_CHECK_TAIL(head, field) do {\t\t\t\t\\\n+\tif (*(head)->tqh_last != NULL)\t\t\t\t\t\\\n+\t    \tpanic(\"Bad tailq NEXT(%p->tqh_last) != NULL\", (head)); \t\\\n+} while (0)\n+\n+/*\n+ * QMD_TAILQ_CHECK_NEXT(TYPE *elm, TAILQ_ENTRY NAME)\n+ *\n+ * If an element follows 'elm' in the tailq, validates that the next element\n+ * points back at 'elm.'\n+ */\n+#define\tQMD_TAILQ_CHECK_NEXT(elm, field) do {\t\t\t\t\\\n+\tif (TAILQ_NEXT((elm), field) != NULL &&\t\t\t\t\\\n+\t    TAILQ_NEXT((elm), field)->field.tqe_prev !=\t\t\t\\\n+\t     &((elm)->field.tqe_next))\t\t\t\t\t\\\n+\t\tpanic(\"Bad link elm %p next->prev != elm\", (elm));\t\\\n+} while (0)\n+\n+/*\n+ * QMD_TAILQ_CHECK_PREV(TYPE *elm, TAILQ_ENTRY NAME)\n+ *\n+ * Validates that the previous element (or head of the tailq) points to 'elm.'\n+ */\n+#define\tQMD_TAILQ_CHECK_PREV(elm, field) do {\t\t\t\t\\\n+\tif (*(elm)->field.tqe_prev != (elm))\t\t\t\t\\\n+\t\tpanic(\"Bad link elm %p prev->next != elm\", (elm));\t\\\n+} while (0)\n+#else\n #define\tQMD_TAILQ_CHECK_HEAD(head, field)\n #define\tQMD_TAILQ_CHECK_TAIL(head, headname)\n #define\tQMD_TAILQ_CHECK_NEXT(elm, field)\n #define\tQMD_TAILQ_CHECK_PREV(elm, field)\n+#endif /* (_KERNEL && INVARIANTS) */\n \n #define\tTAILQ_CONCAT(head1, head2, field) do {\t\t\t\t\\\n \tif (!TAILQ_EMPTY(head2)) {\t\t\t\t\t\\\n@@ -191,9 +735,8 @@ struct {\t\t\t\t\t\t\t\t\\\n \n #define\tTAILQ_INSERT_AFTER(head, listelm, elm, field) do {\t\t\\\n \tQMD_TAILQ_CHECK_NEXT(listelm, field);\t\t\t\t\\\n-\tTAILQ_NEXT((elm), field) = TAILQ_NEXT((listelm), field);\t\\\n-\tif (TAILQ_NEXT((listelm), field) != NULL)\t\t\t\\\n-\t\tTAILQ_NEXT((elm), field)->field.tqe_prev =\t\t\\\n+\tif ((TAILQ_NEXT((elm), field) = TAILQ_NEXT((listelm), field)) != NULL)\\\n+\t\tTAILQ_NEXT((elm), field)->field.tqe_prev = \t\t\\\n \t\t    &TAILQ_NEXT((elm), field);\t\t\t\t\\\n \telse {\t\t\t\t\t\t\t\t\\\n \t\t(head)->tqh_last = &TAILQ_NEXT((elm), field);\t\t\\\n@@ -217,8 +760,7 @@ struct {\t\t\t\t\t\t\t\t\\\n \n #define\tTAILQ_INSERT_HEAD(head, elm, field) do {\t\t\t\\\n \tQMD_TAILQ_CHECK_HEAD(head, field);\t\t\t\t\\\n-\tTAILQ_NEXT((elm), field) = TAILQ_FIRST((head));\t\t\t\\\n-\tif (TAILQ_FIRST((head)) != NULL)\t\t\t\t\\\n+\tif ((TAILQ_NEXT((elm), field) = TAILQ_FIRST((head))) != NULL)\t\\\n \t\tTAILQ_FIRST((head))->field.tqe_prev =\t\t\t\\\n \t\t    &TAILQ_NEXT((elm), field);\t\t\t\t\\\n \telse\t\t\t\t\t\t\t\t\\\n@@ -250,21 +792,24 @@ struct {\t\t\t\t\t\t\t\t\\\n  * you may want to prefetch the last data element.\n  */\n #define\tTAILQ_LAST_FAST(head, type, field)\t\t\t\\\n-\t(TAILQ_EMPTY(head) ? NULL : __containerof((head)->tqh_last,\t\\\n-\tQUEUE_TYPEOF(type), field.tqe_next))\n+    (TAILQ_EMPTY(head) ? NULL : __containerof((head)->tqh_last, QUEUE_TYPEOF(type), field.tqe_next))\n \n #define\tTAILQ_NEXT(elm, field) ((elm)->field.tqe_next)\n \n #define\tTAILQ_PREV(elm, headname, field)\t\t\t\t\\\n \t(*(((struct headname *)((elm)->field.tqe_prev))->tqh_last))\n \n+#define\tTAILQ_PREV_FAST(elm, head, type, field)\t\t\t\t\\\n+    ((elm)->field.tqe_prev == &(head)->tqh_first ? NULL :\t\t\\\n+     __containerof((elm)->field.tqe_prev, QUEUE_TYPEOF(type), field.tqe_next))\n+\n #define\tTAILQ_REMOVE(head, elm, field) do {\t\t\t\t\\\n \tQMD_SAVELINK(oldnext, (elm)->field.tqe_next);\t\t\t\\\n \tQMD_SAVELINK(oldprev, (elm)->field.tqe_prev);\t\t\t\\\n \tQMD_TAILQ_CHECK_NEXT(elm, field);\t\t\t\t\\\n \tQMD_TAILQ_CHECK_PREV(elm, field);\t\t\t\t\\\n \tif ((TAILQ_NEXT((elm), field)) != NULL)\t\t\t\t\\\n-\t\tTAILQ_NEXT((elm), field)->field.tqe_prev =\t\t\\\n+\t\tTAILQ_NEXT((elm), field)->field.tqe_prev = \t\t\\\n \t\t    (elm)->field.tqe_prev;\t\t\t\t\\\n \telse {\t\t\t\t\t\t\t\t\\\n \t\t(head)->tqh_last = (elm)->field.tqe_prev;\t\t\\\n@@ -277,26 +822,20 @@ struct {\t\t\t\t\t\t\t\t\\\n } while (0)\n \n #define TAILQ_SWAP(head1, head2, type, field) do {\t\t\t\\\n-\tQUEUE_TYPEOF(type) * swap_first = (head1)->tqh_first;\t\t\\\n-\tQUEUE_TYPEOF(type) * *swap_last = (head1)->tqh_last;\t\t\\\n+\tQUEUE_TYPEOF(type) *swap_first = (head1)->tqh_first;\t\t\\\n+\tQUEUE_TYPEOF(type) **swap_last = (head1)->tqh_last;\t\t\\\n \t(head1)->tqh_first = (head2)->tqh_first;\t\t\t\\\n \t(head1)->tqh_last = (head2)->tqh_last;\t\t\t\t\\\n \t(head2)->tqh_first = swap_first;\t\t\t\t\\\n \t(head2)->tqh_last = swap_last;\t\t\t\t\t\\\n-\tswap_first = (head1)->tqh_first;\t\t\t\t\\\n-\tif (swap_first != NULL)\t\t\t\t\t\t\\\n+\tif ((swap_first = (head1)->tqh_first) != NULL)\t\t\t\\\n \t\tswap_first->field.tqe_prev = &(head1)->tqh_first;\t\\\n \telse\t\t\t\t\t\t\t\t\\\n \t\t(head1)->tqh_last = &(head1)->tqh_first;\t\t\\\n-\tswap_first = (head2)->tqh_first;\t\t\t\t\\\n-\tif (swap_first != NULL)\t\t\t\\\n+\tif ((swap_first = (head2)->tqh_first) != NULL)\t\t\t\\\n \t\tswap_first->field.tqe_prev = &(head2)->tqh_first;\t\\\n \telse\t\t\t\t\t\t\t\t\\\n \t\t(head2)->tqh_last = &(head2)->tqh_first;\t\t\\\n } while (0)\n \n-#ifdef __cplusplus\n-}\n-#endif\n-\n-#endif /* _SYS_QUEUE_H_ */\n+#endif /* !_SYS_QUEUE_H_ */\n",
    "prefixes": [
        "v9",
        "08/12"
    ]
}