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