Go to the documentation of this file. 84 #if defined(QUEUE_MACRO_DEBUG) || (defined(_KERNEL) && defined(DIAGNOSTIC)) 85 #define _Q_INVALIDATE(a) (a) = ((void *)-1) 87 #define _Q_INVALIDATE(a) 93 #define SLIST_HEAD(name, type) \ 95 struct type *slh_first; \ 98 #define SLIST_HEAD_INITIALIZER(head) \ 101 #define SLIST_ENTRY(type) \ 103 struct type *sle_next; \ 109 #define SLIST_FIRST(head) ((head)->slh_first) 110 #define SLIST_END(head) NULL 111 #define SLIST_EMPTY(head) (SLIST_FIRST(head) == SLIST_END(head)) 112 #define SLIST_NEXT(elm, field) ((elm)->field.sle_next) 114 #define SLIST_FOREACH(var, head, field) \ 115 for ((var) = SLIST_FIRST(head); \ 116 (var) != SLIST_END(head); \ 117 (var) = SLIST_NEXT(var, field)) 119 #define SLIST_FOREACH_PREVPTR(var, varp, head, field) \ 120 for ((varp) = &SLIST_FIRST((head)); \ 121 ((var) = *(varp)) != SLIST_END(head); \ 122 (varp) = &SLIST_NEXT((var), field)) 127 #define SLIST_INIT(head) \ 129 SLIST_FIRST(head) = SLIST_END(head); \ 132 #define SLIST_INSERT_AFTER(slistelm, elm, field) \ 134 (elm)->field.sle_next = (slistelm)->field.sle_next; \ 135 (slistelm)->field.sle_next = (elm); \ 138 #define SLIST_INSERT_HEAD(head, elm, field) \ 140 (elm)->field.sle_next = (head)->slh_first; \ 141 (head)->slh_first = (elm); \ 144 #define SLIST_REMOVE_NEXT(head, elm, field) \ 146 (elm)->field.sle_next = (elm)->field.sle_next->field.sle_next; \ 149 #define SLIST_REMOVE_HEAD(head, field) \ 151 (head)->slh_first = (head)->slh_first->field.sle_next; \ 154 #define SLIST_REMOVE(head, elm, type, field) \ 156 if ((head)->slh_first == (elm)) { \ 157 SLIST_REMOVE_HEAD((head), field); \ 159 struct type *curelm = (head)->slh_first; \ 161 while (curelm->field.sle_next != (elm)) \ 162 curelm = curelm->field.sle_next; \ 163 curelm->field.sle_next = curelm->field.sle_next->field.sle_next; \ 164 _Q_INVALIDATE((elm)->field.sle_next); \ 171 #define LIST_HEAD(name, type) \ 173 struct type *lh_first; \ 176 #define LIST_HEAD_INITIALIZER(head) \ 179 #define LIST_ENTRY(type) \ 181 struct type *le_next; \ 182 struct type **le_prev; \ 188 #define LIST_FIRST(head) ((head)->lh_first) 189 #define LIST_END(head) NULL 190 #define LIST_EMPTY(head) (LIST_FIRST(head) == LIST_END(head)) 191 #define LIST_NEXT(elm, field) ((elm)->field.le_next) 193 #define LIST_FOREACH(var, head, field) \ 194 for ((var) = LIST_FIRST(head); \ 195 (var) != LIST_END(head); \ 196 (var) = LIST_NEXT(var, field)) 201 #define LIST_INIT(head) \ 203 LIST_FIRST(head) = LIST_END(head); \ 206 #define LIST_INSERT_AFTER(listelm, elm, field) \ 208 if (((elm)->field.le_next = (listelm)->field.le_next) != NULL) \ 209 (listelm)->field.le_next->field.le_prev = &(elm)->field.le_next; \ 210 (listelm)->field.le_next = (elm); \ 211 (elm)->field.le_prev = &(listelm)->field.le_next; \ 214 #define LIST_INSERT_BEFORE(listelm, elm, field) \ 216 (elm)->field.le_prev = (listelm)->field.le_prev; \ 217 (elm)->field.le_next = (listelm); \ 218 *(listelm)->field.le_prev = (elm); \ 219 (listelm)->field.le_prev = &(elm)->field.le_next; \ 222 #define LIST_INSERT_HEAD(head, elm, field) \ 224 if (((elm)->field.le_next = (head)->lh_first) != NULL) \ 225 (head)->lh_first->field.le_prev = &(elm)->field.le_next; \ 226 (head)->lh_first = (elm); \ 227 (elm)->field.le_prev = &(head)->lh_first; \ 230 #define LIST_REMOVE(elm, field) \ 232 if ((elm)->field.le_next != NULL) \ 233 (elm)->field.le_next->field.le_prev = (elm)->field.le_prev; \ 234 *(elm)->field.le_prev = (elm)->field.le_next; \ 235 _Q_INVALIDATE((elm)->field.le_prev); \ 236 _Q_INVALIDATE((elm)->field.le_next); \ 239 #define LIST_REPLACE(elm, elm2, field) \ 241 if (((elm2)->field.le_next = (elm)->field.le_next) != NULL) \ 242 (elm2)->field.le_next->field.le_prev = &(elm2)->field.le_next; \ 243 (elm2)->field.le_prev = (elm)->field.le_prev; \ 244 *(elm2)->field.le_prev = (elm2); \ 245 _Q_INVALIDATE((elm)->field.le_prev); \ 246 _Q_INVALIDATE((elm)->field.le_next); \ 252 #define SIMPLEQ_HEAD(name, type) \ 254 struct type *sqh_first; \ 255 struct type **sqh_last; \ 258 #define SIMPLEQ_HEAD_INITIALIZER(head) \ 259 { NULL, &(head).sqh_first } 261 #define SIMPLEQ_ENTRY(type) \ 263 struct type *sqe_next; \ 269 #define SIMPLEQ_FIRST(head) ((head)->sqh_first) 270 #define SIMPLEQ_END(head) NULL 271 #define SIMPLEQ_EMPTY(head) (SIMPLEQ_FIRST(head) == SIMPLEQ_END(head)) 272 #define SIMPLEQ_NEXT(elm, field) ((elm)->field.sqe_next) 274 #define SIMPLEQ_FOREACH(var, head, field) \ 275 for ((var) = SIMPLEQ_FIRST(head); \ 276 (var) != SIMPLEQ_END(head); \ 277 (var) = SIMPLEQ_NEXT(var, field)) 282 #define SIMPLEQ_INIT(head) \ 284 (head)->sqh_first = NULL; \ 285 (head)->sqh_last = &(head)->sqh_first; \ 288 #define SIMPLEQ_INSERT_HEAD(head, elm, field) \ 290 if (((elm)->field.sqe_next = (head)->sqh_first) == NULL) \ 291 (head)->sqh_last = &(elm)->field.sqe_next; \ 292 (head)->sqh_first = (elm); \ 295 #define SIMPLEQ_INSERT_TAIL(head, elm, field) \ 297 (elm)->field.sqe_next = NULL; \ 298 *(head)->sqh_last = (elm); \ 299 (head)->sqh_last = &(elm)->field.sqe_next; \ 302 #define SIMPLEQ_INSERT_AFTER(head, listelm, elm, field) \ 304 if (((elm)->field.sqe_next = (listelm)->field.sqe_next) == NULL) \ 305 (head)->sqh_last = &(elm)->field.sqe_next; \ 306 (listelm)->field.sqe_next = (elm); \ 309 #define SIMPLEQ_REMOVE_HEAD(head, field) \ 311 if (((head)->sqh_first = (head)->sqh_first->field.sqe_next) == NULL) \ 312 (head)->sqh_last = &(head)->sqh_first; \ 318 #define TAILQ_HEAD(name, type) \ 320 struct type *tqh_first; \ 321 struct type **tqh_last; \ 324 #define TAILQ_HEAD_INITIALIZER(head) \ 325 { NULL, &(head).tqh_first } 327 #define TAILQ_ENTRY(type) \ 329 struct type *tqe_next; \ 330 struct type **tqe_prev; \ 336 #define TAILQ_FIRST(head) ((head)->tqh_first) 337 #define TAILQ_END(head) NULL 338 #define TAILQ_NEXT(elm, field) ((elm)->field.tqe_next) 339 #define TAILQ_LAST(head, headname) \ 340 (*(((struct headname *)((head)->tqh_last))->tqh_last)) 342 #define TAILQ_PREV(elm, headname, field) \ 343 (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last)) 344 #define TAILQ_EMPTY(head) \ 345 (TAILQ_FIRST(head) == TAILQ_END(head)) 347 #define TAILQ_FOREACH(var, head, field) \ 348 for ((var) = TAILQ_FIRST(head); \ 349 (var) != TAILQ_END(head); \ 350 (var) = TAILQ_NEXT(var, field)) 352 #define TAILQ_FOREACH_REVERSE(var, head, headname, field) \ 353 for ((var) = TAILQ_LAST(head, headname); \ 354 (var) != TAILQ_END(head); \ 355 (var) = TAILQ_PREV(var, headname, field)) 360 #define TAILQ_INIT(head) \ 362 (head)->tqh_first = NULL; \ 363 (head)->tqh_last = &(head)->tqh_first; \ 366 #define TAILQ_INSERT_HEAD(head, elm, field) \ 368 if (((elm)->field.tqe_next = (head)->tqh_first) != NULL) \ 369 (head)->tqh_first->field.tqe_prev = &(elm)->field.tqe_next; \ 371 (head)->tqh_last = &(elm)->field.tqe_next; \ 372 (head)->tqh_first = (elm); \ 373 (elm)->field.tqe_prev = &(head)->tqh_first; \ 376 #define TAILQ_INSERT_TAIL(head, elm, field) \ 378 (elm)->field.tqe_next = NULL; \ 379 (elm)->field.tqe_prev = (head)->tqh_last; \ 380 *(head)->tqh_last = (elm); \ 381 (head)->tqh_last = &(elm)->field.tqe_next; \ 384 #define TAILQ_INSERT_AFTER(head, listelm, elm, field) \ 386 if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != NULL) \ 387 (elm)->field.tqe_next->field.tqe_prev = &(elm)->field.tqe_next; \ 389 (head)->tqh_last = &(elm)->field.tqe_next; \ 390 (listelm)->field.tqe_next = (elm); \ 391 (elm)->field.tqe_prev = &(listelm)->field.tqe_next; \ 394 #define TAILQ_INSERT_BEFORE(listelm, elm, field) \ 396 (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \ 397 (elm)->field.tqe_next = (listelm); \ 398 *(listelm)->field.tqe_prev = (elm); \ 399 (listelm)->field.tqe_prev = &(elm)->field.tqe_next; \ 402 #define TAILQ_REMOVE(head, elm, field) \ 404 if (((elm)->field.tqe_next) != NULL) \ 405 (elm)->field.tqe_next->field.tqe_prev = (elm)->field.tqe_prev; \ 407 (head)->tqh_last = (elm)->field.tqe_prev; \ 408 *(elm)->field.tqe_prev = (elm)->field.tqe_next; \ 409 _Q_INVALIDATE((elm)->field.tqe_prev); \ 410 _Q_INVALIDATE((elm)->field.tqe_next); \ 413 #define TAILQ_REPLACE(head, elm, elm2, field) \ 415 if (((elm2)->field.tqe_next = (elm)->field.tqe_next) != NULL) \ 416 (elm2)->field.tqe_next->field.tqe_prev = &(elm2)->field.tqe_next; \ 418 (head)->tqh_last = &(elm2)->field.tqe_next; \ 419 (elm2)->field.tqe_prev = (elm)->field.tqe_prev; \ 420 *(elm2)->field.tqe_prev = (elm2); \ 421 _Q_INVALIDATE((elm)->field.tqe_prev); \ 422 _Q_INVALIDATE((elm)->field.tqe_next); \ 426 #define TAILQ_SWAP(first, second, head, field) \ 428 *((first)->field.tqe_prev) = (second); \ 429 (second)->field.tqe_prev = (first)->field.tqe_prev; \ 430 (first)->field.tqe_prev = &((second)->field.tqe_next); \ 431 (first)->field.tqe_next = (second)->field.tqe_next; \ 432 if ((second)->field.tqe_next) \ 433 (second)->field.tqe_next->field.tqe_prev = &((first)->field.tqe_next); \ 434 (second)->field.tqe_next = first; \ 435 if ((head)->tqh_last == &((second)->field.tqe_next)) \ 436 (head)->tqh_last = &((first)->field.tqe_next); \ 442 #define CIRCLEQ_HEAD(name, type) \ 444 struct type *cqh_first; \ 445 struct type *cqh_last; \ 448 #define CIRCLEQ_HEAD_INITIALIZER(head) \ 451 , CIRCLEQ_END(&head) \ 454 #define CIRCLEQ_ENTRY(type) \ 456 struct type *cqe_next; \ 457 struct type *cqe_prev; \ 463 #define CIRCLEQ_FIRST(head) ((head)->cqh_first) 464 #define CIRCLEQ_LAST(head) ((head)->cqh_last) 465 #define CIRCLEQ_END(head) ((void *)(head)) 466 #define CIRCLEQ_NEXT(elm, field) ((elm)->field.cqe_next) 467 #define CIRCLEQ_PREV(elm, field) ((elm)->field.cqe_prev) 468 #define CIRCLEQ_EMPTY(head) \ 469 (CIRCLEQ_FIRST(head) == CIRCLEQ_END(head)) 471 #define CIRCLEQ_FOREACH(var, head, field) \ 472 for ((var) = CIRCLEQ_FIRST(head); \ 473 (var) != CIRCLEQ_END(head); \ 474 (var) = CIRCLEQ_NEXT(var, field)) 476 #define CIRCLEQ_FOREACH_REVERSE(var, head, field) \ 477 for ((var) = CIRCLEQ_LAST(head); \ 478 (var) != CIRCLEQ_END(head); \ 479 (var) = CIRCLEQ_PREV(var, field)) 484 #define CIRCLEQ_INIT(head) \ 486 (head)->cqh_first = CIRCLEQ_END(head); \ 487 (head)->cqh_last = CIRCLEQ_END(head); \ 490 #define CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) \ 492 (elm)->field.cqe_next = (listelm)->field.cqe_next; \ 493 (elm)->field.cqe_prev = (listelm); \ 494 if ((listelm)->field.cqe_next == CIRCLEQ_END(head)) \ 495 (head)->cqh_last = (elm); \ 497 (listelm)->field.cqe_next->field.cqe_prev = (elm); \ 498 (listelm)->field.cqe_next = (elm); \ 501 #define CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) \ 503 (elm)->field.cqe_next = (listelm); \ 504 (elm)->field.cqe_prev = (listelm)->field.cqe_prev; \ 505 if ((listelm)->field.cqe_prev == CIRCLEQ_END(head)) \ 506 (head)->cqh_first = (elm); \ 508 (listelm)->field.cqe_prev->field.cqe_next = (elm); \ 509 (listelm)->field.cqe_prev = (elm); \ 512 #define CIRCLEQ_INSERT_HEAD(head, elm, field) \ 514 (elm)->field.cqe_next = (head)->cqh_first; \ 515 (elm)->field.cqe_prev = CIRCLEQ_END(head); \ 516 if ((head)->cqh_last == CIRCLEQ_END(head)) \ 517 (head)->cqh_last = (elm); \ 519 (head)->cqh_first->field.cqe_prev = (elm); \ 520 (head)->cqh_first = (elm); \ 523 #define CIRCLEQ_INSERT_TAIL(head, elm, field) \ 525 (elm)->field.cqe_next = CIRCLEQ_END(head); \ 526 (elm)->field.cqe_prev = (head)->cqh_last; \ 527 if ((head)->cqh_first == CIRCLEQ_END(head)) \ 528 (head)->cqh_first = (elm); \ 530 (head)->cqh_last->field.cqe_next = (elm); \ 531 (head)->cqh_last = (elm); \ 534 #define CIRCLEQ_REMOVE(head, elm, field) \ 536 if ((elm)->field.cqe_next == CIRCLEQ_END(head)) \ 537 (head)->cqh_last = (elm)->field.cqe_prev; \ 539 (elm)->field.cqe_next->field.cqe_prev = (elm)->field.cqe_prev; \ 540 if ((elm)->field.cqe_prev == CIRCLEQ_END(head)) \ 541 (head)->cqh_first = (elm)->field.cqe_next; \ 543 (elm)->field.cqe_prev->field.cqe_next = (elm)->field.cqe_next; \ 544 _Q_INVALIDATE((elm)->field.cqe_prev); \ 545 _Q_INVALIDATE((elm)->field.cqe_next); \ 548 #define CIRCLEQ_REPLACE(head, elm, elm2, field) \ 550 if (((elm2)->field.cqe_next = (elm)->field.cqe_next) == CIRCLEQ_END(head)) \ 551 (head)->cqh_last = (elm2); \ 553 (elm2)->field.cqe_next->field.cqe_prev = (elm2); \ 554 if (((elm2)->field.cqe_prev = (elm)->field.cqe_prev) == CIRCLEQ_END(head)) \ 555 (head)->cqh_first = (elm2); \ 557 (elm2)->field.cqe_prev->field.cqe_next = (elm2); \ 558 _Q_INVALIDATE((elm)->field.cqe_prev); \ 559 _Q_INVALIDATE((elm)->field.cqe_next); \