Mercurial > code
comparison queue.h @ 42:30499f543188
Remove FreeBSD specific macros in queue.h
author | David Demelier <markand@malikania.fr> |
---|---|
date | Sun, 02 Oct 2011 11:26:30 +0200 |
parents | 4212fb4b4e41 |
children |
comparison
equal
deleted
inserted
replaced
41:5252fa9b5cb1 | 42:30499f543188 |
---|---|
177 #undef TAILQ_NEXT | 177 #undef TAILQ_NEXT |
178 #undef TAILQ_PREV | 178 #undef TAILQ_PREV |
179 #undef TAILQ_REMOVE | 179 #undef TAILQ_REMOVE |
180 #undef TAILQ_SWAP | 180 #undef TAILQ_SWAP |
181 | 181 |
182 #ifdef QUEUE_MACRO_DEBUG | |
183 /* Store the last 2 places the queue element or head was altered */ | |
184 struct qm_trace { | |
185 char * lastfile; | |
186 int lastline; | |
187 char * prevfile; | |
188 int prevline; | |
189 }; | |
190 | |
191 #define TRACEBUF struct qm_trace trace; | |
192 #define TRASHIT(x) do {(x) = (void *)-1;} while (0) | |
193 #define QMD_SAVELINK(name, link) void **name = (void *)&(link) | |
194 | |
195 #define QMD_TRACE_HEAD(head) do { \ | |
196 (head)->trace.prevline = (head)->trace.lastline; \ | |
197 (head)->trace.prevfile = (head)->trace.lastfile; \ | |
198 (head)->trace.lastline = __LINE__; \ | |
199 (head)->trace.lastfile = __FILE__; \ | |
200 } while (0) | |
201 | |
202 #define QMD_TRACE_ELEM(elem) do { \ | |
203 (elem)->trace.prevline = (elem)->trace.lastline; \ | |
204 (elem)->trace.prevfile = (elem)->trace.lastfile; \ | |
205 (elem)->trace.lastline = __LINE__; \ | |
206 (elem)->trace.lastfile = __FILE__; \ | |
207 } while (0) | |
208 | |
209 #else | |
210 #define QMD_TRACE_ELEM(elem) | |
211 #define QMD_TRACE_HEAD(head) | |
212 #define QMD_SAVELINK(name, link) | |
213 #define TRACEBUF | |
214 #define TRASHIT(x) | |
215 #endif /* QUEUE_MACRO_DEBUG */ | |
216 | |
217 /* | 182 /* |
218 * Singly-linked List declarations. | 183 * Singly-linked List declarations. |
219 */ | 184 */ |
220 #define SLIST_HEAD(name, type) \ | 185 #define SLIST_HEAD(name, type) \ |
221 struct name { \ | 186 struct name { \ |
267 } while (0) | 232 } while (0) |
268 | 233 |
269 #define SLIST_NEXT(elm, field) ((elm)->field.sle_next) | 234 #define SLIST_NEXT(elm, field) ((elm)->field.sle_next) |
270 | 235 |
271 #define SLIST_REMOVE(head, elm, type, field) do { \ | 236 #define SLIST_REMOVE(head, elm, type, field) do { \ |
272 QMD_SAVELINK(oldnext, (elm)->field.sle_next); \ | |
273 if (SLIST_FIRST((head)) == (elm)) { \ | 237 if (SLIST_FIRST((head)) == (elm)) { \ |
274 SLIST_REMOVE_HEAD((head), field); \ | 238 SLIST_REMOVE_HEAD((head), field); \ |
275 } \ | 239 } \ |
276 else { \ | 240 else { \ |
277 struct type *curelm = SLIST_FIRST((head)); \ | 241 struct type *curelm = SLIST_FIRST((head)); \ |
278 while (SLIST_NEXT(curelm, field) != (elm)) \ | 242 while (SLIST_NEXT(curelm, field) != (elm)) \ |
279 curelm = SLIST_NEXT(curelm, field); \ | 243 curelm = SLIST_NEXT(curelm, field); \ |
280 SLIST_REMOVE_AFTER(curelm, field); \ | 244 SLIST_REMOVE_AFTER(curelm, field); \ |
281 } \ | 245 } \ |
282 TRASHIT(*oldnext); \ | |
283 } while (0) | 246 } while (0) |
284 | 247 |
285 #define SLIST_REMOVE_AFTER(elm, field) do { \ | 248 #define SLIST_REMOVE_AFTER(elm, field) do { \ |
286 SLIST_NEXT(elm, field) = \ | 249 SLIST_NEXT(elm, field) = \ |
287 SLIST_NEXT(SLIST_NEXT(elm, field), field); \ | 250 SLIST_NEXT(SLIST_NEXT(elm, field), field); \ |
370 ((char *)((head)->stqh_last) - __offsetof(struct type, field)))) | 333 ((char *)((head)->stqh_last) - __offsetof(struct type, field)))) |
371 | 334 |
372 #define STAILQ_NEXT(elm, field) ((elm)->field.stqe_next) | 335 #define STAILQ_NEXT(elm, field) ((elm)->field.stqe_next) |
373 | 336 |
374 #define STAILQ_REMOVE(head, elm, type, field) do { \ | 337 #define STAILQ_REMOVE(head, elm, type, field) do { \ |
375 QMD_SAVELINK(oldnext, (elm)->field.stqe_next); \ | |
376 if (STAILQ_FIRST((head)) == (elm)) { \ | 338 if (STAILQ_FIRST((head)) == (elm)) { \ |
377 STAILQ_REMOVE_HEAD((head), field); \ | 339 STAILQ_REMOVE_HEAD((head), field); \ |
378 } \ | 340 } \ |
379 else { \ | 341 else { \ |
380 struct type *curelm = STAILQ_FIRST((head)); \ | 342 struct type *curelm = STAILQ_FIRST((head)); \ |
381 while (STAILQ_NEXT(curelm, field) != (elm)) \ | 343 while (STAILQ_NEXT(curelm, field) != (elm)) \ |
382 curelm = STAILQ_NEXT(curelm, field); \ | 344 curelm = STAILQ_NEXT(curelm, field); \ |
383 STAILQ_REMOVE_AFTER(head, curelm, field); \ | 345 STAILQ_REMOVE_AFTER(head, curelm, field); \ |
384 } \ | 346 } \ |
385 TRASHIT(*oldnext); \ | |
386 } while (0) | 347 } while (0) |
387 | 348 |
388 #define STAILQ_REMOVE_AFTER(head, elm, field) do { \ | 349 #define STAILQ_REMOVE_AFTER(head, elm, field) do { \ |
389 if ((STAILQ_NEXT(elm, field) = \ | 350 if ((STAILQ_NEXT(elm, field) = \ |
390 STAILQ_NEXT(STAILQ_NEXT(elm, field), field)) == NULL) \ | 351 STAILQ_NEXT(STAILQ_NEXT(elm, field), field)) == NULL) \ |
408 (head1)->stqh_last = &STAILQ_FIRST(head1); \ | 369 (head1)->stqh_last = &STAILQ_FIRST(head1); \ |
409 if (STAILQ_EMPTY(head2)) \ | 370 if (STAILQ_EMPTY(head2)) \ |
410 (head2)->stqh_last = &STAILQ_FIRST(head2); \ | 371 (head2)->stqh_last = &STAILQ_FIRST(head2); \ |
411 } while (0) | 372 } while (0) |
412 | 373 |
413 | |
414 /* | 374 /* |
415 * List declarations. | 375 * List declarations. |
416 */ | 376 */ |
417 #define LIST_HEAD(name, type) \ | 377 #define LIST_HEAD(name, type) \ |
418 struct name { \ | 378 struct name { \ |
430 | 390 |
431 /* | 391 /* |
432 * List functions. | 392 * List functions. |
433 */ | 393 */ |
434 | 394 |
435 #if (defined(_KERNEL) && defined(INVARIANTS)) | |
436 #define QMD_LIST_CHECK_HEAD(head, field) do { \ | |
437 if (LIST_FIRST((head)) != NULL && \ | |
438 LIST_FIRST((head))->field.le_prev != \ | |
439 &LIST_FIRST((head))) \ | |
440 panic("Bad list head %p first->prev != head", (head)); \ | |
441 } while (0) | |
442 | |
443 #define QMD_LIST_CHECK_NEXT(elm, field) do { \ | |
444 if (LIST_NEXT((elm), field) != NULL && \ | |
445 LIST_NEXT((elm), field)->field.le_prev != \ | |
446 &((elm)->field.le_next)) \ | |
447 panic("Bad link elm %p next->prev != elm", (elm)); \ | |
448 } while (0) | |
449 | |
450 #define QMD_LIST_CHECK_PREV(elm, field) do { \ | |
451 if (*(elm)->field.le_prev != (elm)) \ | |
452 panic("Bad link elm %p prev->next != elm", (elm)); \ | |
453 } while (0) | |
454 #else | |
455 #define QMD_LIST_CHECK_HEAD(head, field) | |
456 #define QMD_LIST_CHECK_NEXT(elm, field) | |
457 #define QMD_LIST_CHECK_PREV(elm, field) | |
458 #endif /* (_KERNEL && INVARIANTS) */ | |
459 | |
460 #define LIST_EMPTY(head) ((head)->lh_first == NULL) | 395 #define LIST_EMPTY(head) ((head)->lh_first == NULL) |
461 | 396 |
462 #define LIST_FIRST(head) ((head)->lh_first) | 397 #define LIST_FIRST(head) ((head)->lh_first) |
463 | 398 |
464 #define LIST_FOREACH(var, head, field) \ | 399 #define LIST_FOREACH(var, head, field) \ |
474 #define LIST_INIT(head) do { \ | 409 #define LIST_INIT(head) do { \ |
475 LIST_FIRST((head)) = NULL; \ | 410 LIST_FIRST((head)) = NULL; \ |
476 } while (0) | 411 } while (0) |
477 | 412 |
478 #define LIST_INSERT_AFTER(listelm, elm, field) do { \ | 413 #define LIST_INSERT_AFTER(listelm, elm, field) do { \ |
479 QMD_LIST_CHECK_NEXT(listelm, field); \ | |
480 if ((LIST_NEXT((elm), field) = LIST_NEXT((listelm), field)) != NULL)\ | 414 if ((LIST_NEXT((elm), field) = LIST_NEXT((listelm), field)) != NULL)\ |
481 LIST_NEXT((listelm), field)->field.le_prev = \ | 415 LIST_NEXT((listelm), field)->field.le_prev = \ |
482 &LIST_NEXT((elm), field); \ | 416 &LIST_NEXT((elm), field); \ |
483 LIST_NEXT((listelm), field) = (elm); \ | 417 LIST_NEXT((listelm), field) = (elm); \ |
484 (elm)->field.le_prev = &LIST_NEXT((listelm), field); \ | 418 (elm)->field.le_prev = &LIST_NEXT((listelm), field); \ |
485 } while (0) | 419 } while (0) |
486 | 420 |
487 #define LIST_INSERT_BEFORE(listelm, elm, field) do { \ | 421 #define LIST_INSERT_BEFORE(listelm, elm, field) do { \ |
488 QMD_LIST_CHECK_PREV(listelm, field); \ | |
489 (elm)->field.le_prev = (listelm)->field.le_prev; \ | 422 (elm)->field.le_prev = (listelm)->field.le_prev; \ |
490 LIST_NEXT((elm), field) = (listelm); \ | 423 LIST_NEXT((elm), field) = (listelm); \ |
491 *(listelm)->field.le_prev = (elm); \ | 424 *(listelm)->field.le_prev = (elm); \ |
492 (listelm)->field.le_prev = &LIST_NEXT((elm), field); \ | 425 (listelm)->field.le_prev = &LIST_NEXT((elm), field); \ |
493 } while (0) | 426 } while (0) |
494 | 427 |
495 #define LIST_INSERT_HEAD(head, elm, field) do { \ | 428 #define LIST_INSERT_HEAD(head, elm, field) do { \ |
496 QMD_LIST_CHECK_HEAD((head), field); \ | |
497 if ((LIST_NEXT((elm), field) = LIST_FIRST((head))) != NULL) \ | 429 if ((LIST_NEXT((elm), field) = LIST_FIRST((head))) != NULL) \ |
498 LIST_FIRST((head))->field.le_prev = &LIST_NEXT((elm), field);\ | 430 LIST_FIRST((head))->field.le_prev = &LIST_NEXT((elm), field);\ |
499 LIST_FIRST((head)) = (elm); \ | 431 LIST_FIRST((head)) = (elm); \ |
500 (elm)->field.le_prev = &LIST_FIRST((head)); \ | 432 (elm)->field.le_prev = &LIST_FIRST((head)); \ |
501 } while (0) | 433 } while (0) |
502 | 434 |
503 #define LIST_NEXT(elm, field) ((elm)->field.le_next) | 435 #define LIST_NEXT(elm, field) ((elm)->field.le_next) |
504 | 436 |
505 #define LIST_REMOVE(elm, field) do { \ | 437 #define LIST_REMOVE(elm, field) do { \ |
506 QMD_SAVELINK(oldnext, (elm)->field.le_next); \ | |
507 QMD_SAVELINK(oldprev, (elm)->field.le_prev); \ | |
508 QMD_LIST_CHECK_NEXT(elm, field); \ | |
509 QMD_LIST_CHECK_PREV(elm, field); \ | |
510 if (LIST_NEXT((elm), field) != NULL) \ | 438 if (LIST_NEXT((elm), field) != NULL) \ |
511 LIST_NEXT((elm), field)->field.le_prev = \ | 439 LIST_NEXT((elm), field)->field.le_prev = \ |
512 (elm)->field.le_prev; \ | 440 (elm)->field.le_prev; \ |
513 *(elm)->field.le_prev = LIST_NEXT((elm), field); \ | 441 *(elm)->field.le_prev = LIST_NEXT((elm), field); \ |
514 TRASHIT(*oldnext); \ | |
515 TRASHIT(*oldprev); \ | |
516 } while (0) | 442 } while (0) |
517 | 443 |
518 #define LIST_SWAP(head1, head2, type, field) do { \ | 444 #define LIST_SWAP(head1, head2, type, field) do { \ |
519 struct type *swap_tmp = LIST_FIRST((head1)); \ | 445 struct type *swap_tmp = LIST_FIRST((head1)); \ |
520 LIST_FIRST((head1)) = LIST_FIRST((head2)); \ | 446 LIST_FIRST((head1)) = LIST_FIRST((head2)); \ |
530 */ | 456 */ |
531 #define TAILQ_HEAD(name, type) \ | 457 #define TAILQ_HEAD(name, type) \ |
532 struct name { \ | 458 struct name { \ |
533 struct type *tqh_first; /* first element */ \ | 459 struct type *tqh_first; /* first element */ \ |
534 struct type **tqh_last; /* addr of last next element */ \ | 460 struct type **tqh_last; /* addr of last next element */ \ |
535 TRACEBUF \ | |
536 } | 461 } |
537 | 462 |
538 #define TAILQ_HEAD_INITIALIZER(head) \ | 463 #define TAILQ_HEAD_INITIALIZER(head) \ |
539 { NULL, &(head).tqh_first } | 464 { NULL, &(head).tqh_first } |
540 | 465 |
541 #define TAILQ_ENTRY(type) \ | 466 #define TAILQ_ENTRY(type) \ |
542 struct { \ | 467 struct { \ |
543 struct type *tqe_next; /* next element */ \ | 468 struct type *tqe_next; /* next element */ \ |
544 struct type **tqe_prev; /* address of previous next element */ \ | 469 struct type **tqe_prev; /* address of previous next element */ \ |
545 TRACEBUF \ | |
546 } | 470 } |
547 | 471 |
548 /* | 472 /* |
549 * Tail queue functions. | 473 * Tail queue functions. |
550 */ | 474 */ |
551 #if (defined(_KERNEL) && defined(INVARIANTS)) | |
552 #define QMD_TAILQ_CHECK_HEAD(head, field) do { \ | |
553 if (!TAILQ_EMPTY(head) && \ | |
554 TAILQ_FIRST((head))->field.tqe_prev != \ | |
555 &TAILQ_FIRST((head))) \ | |
556 panic("Bad tailq head %p first->prev != head", (head)); \ | |
557 } while (0) | |
558 | |
559 #define QMD_TAILQ_CHECK_TAIL(head, field) do { \ | |
560 if (*(head)->tqh_last != NULL) \ | |
561 panic("Bad tailq NEXT(%p->tqh_last) != NULL", (head)); \ | |
562 } while (0) | |
563 | |
564 #define QMD_TAILQ_CHECK_NEXT(elm, field) do { \ | |
565 if (TAILQ_NEXT((elm), field) != NULL && \ | |
566 TAILQ_NEXT((elm), field)->field.tqe_prev != \ | |
567 &((elm)->field.tqe_next)) \ | |
568 panic("Bad link elm %p next->prev != elm", (elm)); \ | |
569 } while (0) | |
570 | |
571 #define QMD_TAILQ_CHECK_PREV(elm, field) do { \ | |
572 if (*(elm)->field.tqe_prev != (elm)) \ | |
573 panic("Bad link elm %p prev->next != elm", (elm)); \ | |
574 } while (0) | |
575 #else | |
576 #define QMD_TAILQ_CHECK_HEAD(head, field) | |
577 #define QMD_TAILQ_CHECK_TAIL(head, headname) | |
578 #define QMD_TAILQ_CHECK_NEXT(elm, field) | |
579 #define QMD_TAILQ_CHECK_PREV(elm, field) | |
580 #endif /* (_KERNEL && INVARIANTS) */ | |
581 | 475 |
582 #define TAILQ_CONCAT(head1, head2, field) do { \ | 476 #define TAILQ_CONCAT(head1, head2, field) do { \ |
583 if (!TAILQ_EMPTY(head2)) { \ | 477 if (!TAILQ_EMPTY(head2)) { \ |
584 *(head1)->tqh_last = (head2)->tqh_first; \ | 478 *(head1)->tqh_last = (head2)->tqh_first; \ |
585 (head2)->tqh_first->field.tqe_prev = (head1)->tqh_last; \ | 479 (head2)->tqh_first->field.tqe_prev = (head1)->tqh_last; \ |
586 (head1)->tqh_last = (head2)->tqh_last; \ | 480 (head1)->tqh_last = (head2)->tqh_last; \ |
587 TAILQ_INIT((head2)); \ | 481 TAILQ_INIT((head2)); \ |
588 QMD_TRACE_HEAD(head1); \ | |
589 QMD_TRACE_HEAD(head2); \ | |
590 } \ | 482 } \ |
591 } while (0) | 483 } while (0) |
592 | 484 |
593 #define TAILQ_EMPTY(head) ((head)->tqh_first == NULL) | 485 #define TAILQ_EMPTY(head) ((head)->tqh_first == NULL) |
594 | 486 |
615 (var) = (tvar)) | 507 (var) = (tvar)) |
616 | 508 |
617 #define TAILQ_INIT(head) do { \ | 509 #define TAILQ_INIT(head) do { \ |
618 TAILQ_FIRST((head)) = NULL; \ | 510 TAILQ_FIRST((head)) = NULL; \ |
619 (head)->tqh_last = &TAILQ_FIRST((head)); \ | 511 (head)->tqh_last = &TAILQ_FIRST((head)); \ |
620 QMD_TRACE_HEAD(head); \ | |
621 } while (0) | 512 } while (0) |
622 | 513 |
623 #define TAILQ_INSERT_AFTER(head, listelm, elm, field) do { \ | 514 #define TAILQ_INSERT_AFTER(head, listelm, elm, field) do { \ |
624 QMD_TAILQ_CHECK_NEXT(listelm, field); \ | |
625 if ((TAILQ_NEXT((elm), field) = TAILQ_NEXT((listelm), field)) != NULL)\ | 515 if ((TAILQ_NEXT((elm), field) = TAILQ_NEXT((listelm), field)) != NULL)\ |
626 TAILQ_NEXT((elm), field)->field.tqe_prev = \ | 516 TAILQ_NEXT((elm), field)->field.tqe_prev = \ |
627 &TAILQ_NEXT((elm), field); \ | 517 &TAILQ_NEXT((elm), field); \ |
628 else { \ | 518 else { \ |
629 (head)->tqh_last = &TAILQ_NEXT((elm), field); \ | 519 (head)->tqh_last = &TAILQ_NEXT((elm), field); \ |
630 QMD_TRACE_HEAD(head); \ | |
631 } \ | 520 } \ |
632 TAILQ_NEXT((listelm), field) = (elm); \ | 521 TAILQ_NEXT((listelm), field) = (elm); \ |
633 (elm)->field.tqe_prev = &TAILQ_NEXT((listelm), field); \ | 522 (elm)->field.tqe_prev = &TAILQ_NEXT((listelm), field); \ |
634 QMD_TRACE_ELEM(&(elm)->field); \ | |
635 QMD_TRACE_ELEM(&listelm->field); \ | |
636 } while (0) | 523 } while (0) |
637 | 524 |
638 #define TAILQ_INSERT_BEFORE(listelm, elm, field) do { \ | 525 #define TAILQ_INSERT_BEFORE(listelm, elm, field) do { \ |
639 QMD_TAILQ_CHECK_PREV(listelm, field); \ | |
640 (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \ | 526 (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \ |
641 TAILQ_NEXT((elm), field) = (listelm); \ | 527 TAILQ_NEXT((elm), field) = (listelm); \ |
642 *(listelm)->field.tqe_prev = (elm); \ | 528 *(listelm)->field.tqe_prev = (elm); \ |
643 (listelm)->field.tqe_prev = &TAILQ_NEXT((elm), field); \ | 529 (listelm)->field.tqe_prev = &TAILQ_NEXT((elm), field); \ |
644 QMD_TRACE_ELEM(&(elm)->field); \ | |
645 QMD_TRACE_ELEM(&listelm->field); \ | |
646 } while (0) | 530 } while (0) |
647 | 531 |
648 #define TAILQ_INSERT_HEAD(head, elm, field) do { \ | 532 #define TAILQ_INSERT_HEAD(head, elm, field) do { \ |
649 QMD_TAILQ_CHECK_HEAD(head, field); \ | |
650 if ((TAILQ_NEXT((elm), field) = TAILQ_FIRST((head))) != NULL) \ | 533 if ((TAILQ_NEXT((elm), field) = TAILQ_FIRST((head))) != NULL) \ |
651 TAILQ_FIRST((head))->field.tqe_prev = \ | 534 TAILQ_FIRST((head))->field.tqe_prev = \ |
652 &TAILQ_NEXT((elm), field); \ | 535 &TAILQ_NEXT((elm), field); \ |
653 else \ | 536 else \ |
654 (head)->tqh_last = &TAILQ_NEXT((elm), field); \ | 537 (head)->tqh_last = &TAILQ_NEXT((elm), field); \ |
655 TAILQ_FIRST((head)) = (elm); \ | 538 TAILQ_FIRST((head)) = (elm); \ |
656 (elm)->field.tqe_prev = &TAILQ_FIRST((head)); \ | 539 (elm)->field.tqe_prev = &TAILQ_FIRST((head)); \ |
657 QMD_TRACE_HEAD(head); \ | |
658 QMD_TRACE_ELEM(&(elm)->field); \ | |
659 } while (0) | 540 } while (0) |
660 | 541 |
661 #define TAILQ_INSERT_TAIL(head, elm, field) do { \ | 542 #define TAILQ_INSERT_TAIL(head, elm, field) do { \ |
662 QMD_TAILQ_CHECK_TAIL(head, field); \ | |
663 TAILQ_NEXT((elm), field) = NULL; \ | 543 TAILQ_NEXT((elm), field) = NULL; \ |
664 (elm)->field.tqe_prev = (head)->tqh_last; \ | 544 (elm)->field.tqe_prev = (head)->tqh_last; \ |
665 *(head)->tqh_last = (elm); \ | 545 *(head)->tqh_last = (elm); \ |
666 (head)->tqh_last = &TAILQ_NEXT((elm), field); \ | 546 (head)->tqh_last = &TAILQ_NEXT((elm), field); \ |
667 QMD_TRACE_HEAD(head); \ | |
668 QMD_TRACE_ELEM(&(elm)->field); \ | |
669 } while (0) | 547 } while (0) |
670 | 548 |
671 #define TAILQ_LAST(head, headname) \ | 549 #define TAILQ_LAST(head, headname) \ |
672 (*(((struct headname *)((head)->tqh_last))->tqh_last)) | 550 (*(((struct headname *)((head)->tqh_last))->tqh_last)) |
673 | 551 |
675 | 553 |
676 #define TAILQ_PREV(elm, headname, field) \ | 554 #define TAILQ_PREV(elm, headname, field) \ |
677 (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last)) | 555 (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last)) |
678 | 556 |
679 #define TAILQ_REMOVE(head, elm, field) do { \ | 557 #define TAILQ_REMOVE(head, elm, field) do { \ |
680 QMD_SAVELINK(oldnext, (elm)->field.tqe_next); \ | |
681 QMD_SAVELINK(oldprev, (elm)->field.tqe_prev); \ | |
682 QMD_TAILQ_CHECK_NEXT(elm, field); \ | |
683 QMD_TAILQ_CHECK_PREV(elm, field); \ | |
684 if ((TAILQ_NEXT((elm), field)) != NULL) \ | 558 if ((TAILQ_NEXT((elm), field)) != NULL) \ |
685 TAILQ_NEXT((elm), field)->field.tqe_prev = \ | 559 TAILQ_NEXT((elm), field)->field.tqe_prev = \ |
686 (elm)->field.tqe_prev; \ | 560 (elm)->field.tqe_prev; \ |
687 else { \ | 561 else { \ |
688 (head)->tqh_last = (elm)->field.tqe_prev; \ | 562 (head)->tqh_last = (elm)->field.tqe_prev; \ |
689 QMD_TRACE_HEAD(head); \ | |
690 } \ | 563 } \ |
691 *(elm)->field.tqe_prev = TAILQ_NEXT((elm), field); \ | 564 *(elm)->field.tqe_prev = TAILQ_NEXT((elm), field); \ |
692 TRASHIT(*oldnext); \ | |
693 TRASHIT(*oldprev); \ | |
694 QMD_TRACE_ELEM(&(elm)->field); \ | |
695 } while (0) | 565 } while (0) |
696 | 566 |
697 #define TAILQ_SWAP(head1, head2, type, field) do { \ | 567 #define TAILQ_SWAP(head1, head2, type, field) do { \ |
698 struct type *swap_first = (head1)->tqh_first; \ | 568 struct type *swap_first = (head1)->tqh_first; \ |
699 struct type **swap_last = (head1)->tqh_last; \ | 569 struct type **swap_last = (head1)->tqh_last; \ |