- Timestamp:
- 11/27/05 13:45:49 (6 years ago)
- File:
-
- 1 edited
-
trunk/ithildin/include/ithildin/queue.h (modified) (15 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/ithildin/include/ithildin/queue.h
r578 r630 9 9 10 10 #ifndef QUEUE_H 11 #define QUEUE_H11 #define QUEUE_H 12 12 13 13 /* a shim struct for the *_ALLOC calls. */ … … 17 17 18 18 #undef SLIST_ALLOC 19 #define SLIST_ALLOC(head) do { \20 (head) = malloc(sizeof(SLIST_HEAD(, queue__shim__struct__))); \21 SLIST_INIT((head)); \19 #define SLIST_ALLOC(head) do { \ 20 (head) = malloc(sizeof(SLIST_HEAD(, queue__shim__struct__))); \ 21 SLIST_INIT((head)); \ 22 22 } while (0) 23 23 #undef SLIST_FREE 24 #define SLIST_FREE(head) do { \25 free((head)); \24 #define SLIST_FREE(head) do { \ 25 free((head)); \ 26 26 } while (0) 27 27 28 28 #undef STAILQ_ALLOC 29 29 #define STAILQ_ALLOC(head) do { \ 30 (head) = malloc(sizeof(STAILQ_HEAD(, queue__shim__struct__))); \31 STAILQ_INIT((head)); \30 (head) = malloc(sizeof(STAILQ_HEAD(, queue__shim__struct__))); \ 31 STAILQ_INIT((head)); \ 32 32 } while (0) 33 33 #undef STAILQ_FREE 34 #define STAILQ_FREE(head) do { \35 free((head)); \34 #define STAILQ_FREE(head) do { \ 35 free((head)); \ 36 36 } while (0) 37 37 38 38 #undef LIST_ALLOC 39 #define LIST_ALLOC(head) do { \40 (head) = malloc(sizeof(LIST_HEAD(, queue__shim__struct__))); \41 LIST_INIT((head)); \39 #define LIST_ALLOC(head) do { \ 40 (head) = malloc(sizeof(LIST_HEAD(, queue__shim__struct__))); \ 41 LIST_INIT((head)); \ 42 42 } while (0) 43 43 #undef LIST_FREE 44 #define LIST_FREE(head) do { \45 free((head)); \44 #define LIST_FREE(head) do { \ 45 free((head)); \ 46 46 } while (0) 47 47 48 48 #undef TAILQ_ALLOC 49 #define TAILQ_ALLOC(head) do { \50 (head) = malloc(sizeof(TAILQ_HEAD(, queue__shim__struct__))); \51 TAILQ_INIT((head)); \49 #define TAILQ_ALLOC(head) do { \ 50 (head) = malloc(sizeof(TAILQ_HEAD(, queue__shim__struct__))); \ 51 TAILQ_INIT((head)); \ 52 52 } while (0) 53 53 #undef TAILQ_FREE 54 #define TAILQ_FREE(head) do { \55 free((head)); \54 #define TAILQ_FREE(head) do { \ 55 free((head)); \ 56 56 } while (0) 57 57 … … 207 207 * 208 208 * 209 * SLIST LIST STAILQTAILQ210 * _HEAD + + + +211 * _HEAD_INITIALIZER + + + +212 * _ENTRY + + + +213 * _INIT + + + +214 * _EMPTY + + + +215 * _FIRST + + + +216 * _NEXT + + + +217 * _PREV - - - +218 * _LAST - - + +219 * _FOREACH + + + +220 * _FOREACH_REVERSE - - - +221 * _INSERT_HEAD + + + +222 * _INSERT_BEFORE - + - +223 * _INSERT_AFTER + + + +224 * _INSERT_TAIL - - + +209 * SLIST LIST STAILQ TAILQ 210 * _HEAD + + + + 211 * _HEAD_INITIALIZER + + + + 212 * _ENTRY + + + + 213 * _INIT + + + + 214 * _EMPTY + + + + 215 * _FIRST + + + + 216 * _NEXT + + + + 217 * _PREV - - - + 218 * _LAST - - + + 219 * _FOREACH + + + + 220 * _FOREACH_REVERSE - - - + 221 * _INSERT_HEAD + + + + 222 * _INSERT_BEFORE - + - + 223 * _INSERT_AFTER + + + + 224 * _INSERT_TAIL - - + + 225 225 * _CONCAT - - + + 226 * _REMOVE_HEAD + - + -226 * _REMOVE_HEAD + - + - 227 227 * _REMOVE + + + + 228 228 * … … 240 240 #define TRASHIT(x) do {(x) = (void *)-1;} while (0) 241 241 242 #define QMD_TRACE_HEAD(head) do { \243 (head)->trace.prevline = (head)->trace.lastline; \244 (head)->trace.prevfile = (head)->trace.lastfile; \245 (head)->trace.lastline = __LINE__; \246 (head)->trace.lastfile = __FILE__; \247 } while (0) 248 249 #define QMD_TRACE_ELEM(elem) do { \250 (elem)->trace.prevline = (elem)->trace.lastline; \251 (elem)->trace.prevfile = (elem)->trace.lastfile; \252 (elem)->trace.lastline = __LINE__; \253 (elem)->trace.lastfile = __FILE__; \242 #define QMD_TRACE_HEAD(head) do { \ 243 (head)->trace.prevline = (head)->trace.lastline; \ 244 (head)->trace.prevfile = (head)->trace.lastfile; \ 245 (head)->trace.lastline = __LINE__; \ 246 (head)->trace.lastfile = __FILE__; \ 247 } while (0) 248 249 #define QMD_TRACE_ELEM(elem) do { \ 250 (elem)->trace.prevline = (elem)->trace.lastline; \ 251 (elem)->trace.prevfile = (elem)->trace.lastfile; \ 252 (elem)->trace.lastline = __LINE__; \ 253 (elem)->trace.lastfile = __FILE__; \ 254 254 } while (0) 255 255 … … 264 264 * Singly-linked List declarations. 265 265 */ 266 #define SLIST_HEAD(name, type) \267 struct name { \268 struct type *slh_first; /* first element */ \269 } 270 271 #define SLIST_HEAD_INITIALIZER(head) \266 #define SLIST_HEAD(name, type) \ 267 struct name { \ 268 struct type *slh_first; /* first element */ \ 269 } 270 271 #define SLIST_HEAD_INITIALIZER(head) \ 272 272 { NULL } 273 273 274 #define SLIST_ENTRY(type) \275 struct { \276 struct type *sle_next; /* next element */ \274 #define SLIST_ENTRY(type) \ 275 struct { \ 276 struct type *sle_next; /* next element */ \ 277 277 } 278 278 … … 284 284 #define SLIST_FIRST(head) ((head)->slh_first) 285 285 286 #define SLIST_FOREACH(var, head, field) \287 for ((var) = SLIST_FIRST((head)); \288 (var); \286 #define SLIST_FOREACH(var, head, field) \ 287 for ((var) = SLIST_FIRST((head)); \ 288 (var); \ 289 289 (var) = SLIST_NEXT((var), field)) 290 290 291 #define SLIST_FOREACH_PREVPTR(var, varp, head, field) \292 for ((varp) = &SLIST_FIRST((head)); \293 ((var) = *(varp)) != NULL; \291 #define SLIST_FOREACH_PREVPTR(var, varp, head, field) \ 292 for ((varp) = &SLIST_FIRST((head)); \ 293 ((var) = *(varp)) != NULL; \ 294 294 (varp) = &SLIST_NEXT((var), field)) 295 295 296 #define SLIST_INIT(head) do { \297 SLIST_FIRST((head)) = NULL; \298 } while (0) 299 300 #define SLIST_INSERT_AFTER(slistelm, elm, field) do { \301 SLIST_NEXT((elm), field) = SLIST_NEXT((slistelm), field); \302 SLIST_NEXT((slistelm), field) = (elm); \296 #define SLIST_INIT(head) do { \ 297 SLIST_FIRST((head)) = NULL; \ 298 } while (0) 299 300 #define SLIST_INSERT_AFTER(slistelm, elm, field) do { \ 301 SLIST_NEXT((elm), field) = SLIST_NEXT((slistelm), field); \ 302 SLIST_NEXT((slistelm), field) = (elm); \ 303 303 } while (0) 304 304 305 305 #define SLIST_INSERT_HEAD(head, elm, field) do { \ 306 306 SLIST_NEXT((elm), field) = SLIST_FIRST((head)); \ 307 SLIST_FIRST((head)) = (elm); \307 SLIST_FIRST((head)) = (elm); \ 308 308 } while (0) 309 309 310 310 #define SLIST_NEXT(elm, field) ((elm)->field.sle_next) 311 311 312 #define SLIST_REMOVE(head, elm, type, field) do { \313 if (SLIST_FIRST((head)) == (elm)) { \314 SLIST_REMOVE_HEAD((head), field); \315 } \316 else { \317 struct type *curelm = SLIST_FIRST((head)); \318 while (SLIST_NEXT(curelm, field) != (elm)) \319 curelm = SLIST_NEXT(curelm, field); \320 SLIST_NEXT(curelm, field) = \321 SLIST_NEXT(SLIST_NEXT(curelm, field), field); \322 } \323 } while (0) 324 325 #define SLIST_REMOVE_HEAD(head, field) do { \326 SLIST_FIRST((head)) = SLIST_NEXT(SLIST_FIRST((head)), field); \312 #define SLIST_REMOVE(head, elm, type, field) do { \ 313 if (SLIST_FIRST((head)) == (elm)) { \ 314 SLIST_REMOVE_HEAD((head), field); \ 315 } \ 316 else { \ 317 struct type *curelm = SLIST_FIRST((head)); \ 318 while (SLIST_NEXT(curelm, field) != (elm)) \ 319 curelm = SLIST_NEXT(curelm, field); \ 320 SLIST_NEXT(curelm, field) = \ 321 SLIST_NEXT(SLIST_NEXT(curelm, field), field); \ 322 } \ 323 } while (0) 324 325 #define SLIST_REMOVE_HEAD(head, field) do { \ 326 SLIST_FIRST((head)) = SLIST_NEXT(SLIST_FIRST((head)), field); \ 327 327 } while (0) 328 328 … … 330 330 * Singly-linked Tail queue declarations. 331 331 */ 332 #define STAILQ_HEAD(name, type) \333 struct name { \334 struct type *stqh_first;/* first element */ \332 #define STAILQ_HEAD(name, type) \ 333 struct name { \ 334 struct type *stqh_first;/* first element */ \ 335 335 struct type **stqh_last;/* addr of last next element */ \ 336 336 } 337 337 338 #define STAILQ_HEAD_INITIALIZER(head) \338 #define STAILQ_HEAD_INITIALIZER(head) \ 339 339 { NULL, &(head).stqh_first } 340 340 341 #define STAILQ_ENTRY(type) \342 struct { \343 struct type *stqe_next; /* next element */ \341 #define STAILQ_ENTRY(type) \ 342 struct { \ 343 struct type *stqe_next; /* next element */ \ 344 344 } 345 345 … … 348 348 */ 349 349 #define STAILQ_CONCAT(head1, head2) do { \ 350 if (!STAILQ_EMPTY((head2))) { \351 *(head1)->stqh_last = (head2)->stqh_first; \352 (head1)->stqh_last = (head2)->stqh_last; \353 STAILQ_INIT((head2)); \354 } \350 if (!STAILQ_EMPTY((head2))) { \ 351 *(head1)->stqh_last = (head2)->stqh_first; \ 352 (head1)->stqh_last = (head2)->stqh_last; \ 353 STAILQ_INIT((head2)); \ 354 } \ 355 355 } while (0) 356 356 … … 360 360 361 361 #define STAILQ_FOREACH(var, head, field) \ 362 for((var) = STAILQ_FIRST((head)); \363 (var); \362 for((var) = STAILQ_FIRST((head)); \ 363 (var); \ 364 364 (var) = STAILQ_NEXT((var), field)) 365 365 366 #define STAILQ_INIT(head) do { \367 STAILQ_FIRST((head)) = NULL; \368 (head)->stqh_last = &STAILQ_FIRST((head)); \369 } while (0) 370 371 #define STAILQ_INSERT_AFTER(head, tqelm, elm, field) do { \372 if ((STAILQ_NEXT((elm), field) = STAILQ_NEXT((tqelm), field)) == NULL) \366 #define STAILQ_INIT(head) do { \ 367 STAILQ_FIRST((head)) = NULL; \ 368 (head)->stqh_last = &STAILQ_FIRST((head)); \ 369 } while (0) 370 371 #define STAILQ_INSERT_AFTER(head, tqelm, elm, field) do { \ 372 if ((STAILQ_NEXT((elm), field) = STAILQ_NEXT((tqelm), field)) == NULL) \ 373 373 (head)->stqh_last = &STAILQ_NEXT((elm), field); \ 374 STAILQ_NEXT((tqelm), field) = (elm); \375 } while (0) 376 377 #define STAILQ_INSERT_HEAD(head, elm, field) do { \374 STAILQ_NEXT((tqelm), field) = (elm); \ 375 } while (0) 376 377 #define STAILQ_INSERT_HEAD(head, elm, field) do { \ 378 378 if ((STAILQ_NEXT((elm), field) = STAILQ_FIRST((head))) == NULL) \ 379 379 (head)->stqh_last = &STAILQ_NEXT((elm), field); \ 380 STAILQ_FIRST((head)) = (elm); \381 } while (0) 382 383 #define STAILQ_INSERT_TAIL(head, elm, field) do { \384 STAILQ_NEXT((elm), field) = NULL; \385 *(head)->stqh_last = (elm); \380 STAILQ_FIRST((head)) = (elm); \ 381 } while (0) 382 383 #define STAILQ_INSERT_TAIL(head, elm, field) do { \ 384 STAILQ_NEXT((elm), field) = NULL; \ 385 *(head)->stqh_last = (elm); \ 386 386 (head)->stqh_last = &STAILQ_NEXT((elm), field); \ 387 387 } while (0) 388 388 389 #define STAILQ_LAST(head, type, field) \389 #define STAILQ_LAST(head, type, field) \ 390 390 (STAILQ_EMPTY((head)) ? \ 391 NULL : \392 ((struct type *) \391 NULL : \ 392 ((struct type *) \ 393 393 ((char *)((head)->stqh_last) - __offsetof(struct type, field)))) 394 394 395 395 #define STAILQ_NEXT(elm, field) ((elm)->field.stqe_next) 396 396 397 #define STAILQ_REMOVE(head, elm, type, field) do { \398 if (STAILQ_FIRST((head)) == (elm)) { \399 STAILQ_REMOVE_HEAD((head), field); \400 } \401 else { \402 struct type *curelm = STAILQ_FIRST((head)); \403 while (STAILQ_NEXT(curelm, field) != (elm)) \404 curelm = STAILQ_NEXT(curelm, field); \405 if ((STAILQ_NEXT(curelm, field) = \406 STAILQ_NEXT(STAILQ_NEXT(curelm, field), field)) == NULL) \407 (head)->stqh_last = &STAILQ_NEXT((curelm), field); \408 } \409 } while (0) 410 411 #define STAILQ_REMOVE_HEAD(head, field) do { \412 if ((STAILQ_FIRST((head)) = \397 #define STAILQ_REMOVE(head, elm, type, field) do { \ 398 if (STAILQ_FIRST((head)) == (elm)) { \ 399 STAILQ_REMOVE_HEAD((head), field); \ 400 } \ 401 else { \ 402 struct type *curelm = STAILQ_FIRST((head)); \ 403 while (STAILQ_NEXT(curelm, field) != (elm)) \ 404 curelm = STAILQ_NEXT(curelm, field); \ 405 if ((STAILQ_NEXT(curelm, field) = \ 406 STAILQ_NEXT(STAILQ_NEXT(curelm, field), field)) == NULL) \ 407 (head)->stqh_last = &STAILQ_NEXT((curelm), field); \ 408 } \ 409 } while (0) 410 411 #define STAILQ_REMOVE_HEAD(head, field) do { \ 412 if ((STAILQ_FIRST((head)) = \ 413 413 STAILQ_NEXT(STAILQ_FIRST((head)), field)) == NULL) \ 414 (head)->stqh_last = &STAILQ_FIRST((head)); \415 } while (0) 416 417 #define STAILQ_REMOVE_HEAD_UNTIL(head, elm, field) do { \414 (head)->stqh_last = &STAILQ_FIRST((head)); \ 415 } while (0) 416 417 #define STAILQ_REMOVE_HEAD_UNTIL(head, elm, field) do { \ 418 418 if ((STAILQ_FIRST((head)) = STAILQ_NEXT((elm), field)) == NULL) \ 419 (head)->stqh_last = &STAILQ_FIRST((head)); \419 (head)->stqh_last = &STAILQ_FIRST((head)); \ 420 420 } while (0) 421 421 … … 423 423 * List declarations. 424 424 */ 425 #define LIST_HEAD(name, type) \426 struct name { \427 struct type *lh_first; /* first element */ \428 } 429 430 #define LIST_HEAD_INITIALIZER(head) \425 #define LIST_HEAD(name, type) \ 426 struct name { \ 427 struct type *lh_first; /* first element */ \ 428 } 429 430 #define LIST_HEAD_INITIALIZER(head) \ 431 431 { NULL } 432 432 433 433 #define LIST_ENTRY(type) \ 434 struct { \434 struct { \ 435 435 struct type *le_next; /* next element */ \ 436 struct type **le_prev; /* address of previous next element */ \436 struct type **le_prev; /* address of previous next element */ \ 437 437 } 438 438 … … 445 445 #define LIST_FIRST(head) ((head)->lh_first) 446 446 447 #define LIST_FOREACH(var, head, field) \448 for ((var) = LIST_FIRST((head)); \449 (var); \447 #define LIST_FOREACH(var, head, field) \ 448 for ((var) = LIST_FIRST((head)); \ 449 (var); \ 450 450 (var) = LIST_NEXT((var), field)) 451 451 452 #define LIST_INIT(head) do { \453 LIST_FIRST((head)) = NULL; \454 } while (0) 455 456 #define LIST_INSERT_AFTER(listelm, elm, field) do { \457 if ((LIST_NEXT((elm), field) = LIST_NEXT((listelm), field)) != NULL) \458 LIST_NEXT((listelm), field)->field.le_prev = \459 &LIST_NEXT((elm), field); \460 LIST_NEXT((listelm), field) = (elm); \461 (elm)->field.le_prev = &LIST_NEXT((listelm), field); \462 } while (0) 463 464 #define LIST_INSERT_BEFORE(listelm, elm, field) do { \465 (elm)->field.le_prev = (listelm)->field.le_prev; \466 LIST_NEXT((elm), field) = (listelm); \467 *(listelm)->field.le_prev = (elm); \468 (listelm)->field.le_prev = &LIST_NEXT((elm), field); \469 } while (0) 470 471 #define LIST_INSERT_HEAD(head, elm, field) do { \472 if ((LIST_NEXT((elm), field) = LIST_FIRST((head))) != NULL) \473 LIST_FIRST((head))->field.le_prev = &LIST_NEXT((elm), field); \474 LIST_FIRST((head)) = (elm); \475 (elm)->field.le_prev = &LIST_FIRST((head)); \452 #define LIST_INIT(head) do { \ 453 LIST_FIRST((head)) = NULL; \ 454 } while (0) 455 456 #define LIST_INSERT_AFTER(listelm, elm, field) do { \ 457 if ((LIST_NEXT((elm), field) = LIST_NEXT((listelm), field)) != NULL) \ 458 LIST_NEXT((listelm), field)->field.le_prev = \ 459 &LIST_NEXT((elm), field); \ 460 LIST_NEXT((listelm), field) = (elm); \ 461 (elm)->field.le_prev = &LIST_NEXT((listelm), field); \ 462 } while (0) 463 464 #define LIST_INSERT_BEFORE(listelm, elm, field) do { \ 465 (elm)->field.le_prev = (listelm)->field.le_prev; \ 466 LIST_NEXT((elm), field) = (listelm); \ 467 *(listelm)->field.le_prev = (elm); \ 468 (listelm)->field.le_prev = &LIST_NEXT((elm), field); \ 469 } while (0) 470 471 #define LIST_INSERT_HEAD(head, elm, field) do { \ 472 if ((LIST_NEXT((elm), field) = LIST_FIRST((head))) != NULL) \ 473 LIST_FIRST((head))->field.le_prev = &LIST_NEXT((elm), field); \ 474 LIST_FIRST((head)) = (elm); \ 475 (elm)->field.le_prev = &LIST_FIRST((head)); \ 476 476 } while (0) 477 477 478 478 #define LIST_NEXT(elm, field) ((elm)->field.le_next) 479 479 480 #define LIST_REMOVE(elm, field) do { \481 if (LIST_NEXT((elm), field) != NULL) \482 LIST_NEXT((elm), field)->field.le_prev = \483 (elm)->field.le_prev; \484 *(elm)->field.le_prev = LIST_NEXT((elm), field); \480 #define LIST_REMOVE(elm, field) do { \ 481 if (LIST_NEXT((elm), field) != NULL) \ 482 LIST_NEXT((elm), field)->field.le_prev = \ 483 (elm)->field.le_prev; \ 484 *(elm)->field.le_prev = LIST_NEXT((elm), field); \ 485 485 } while (0) 486 486 … … 488 488 * Tail queue declarations. 489 489 */ 490 #define TAILQ_HEAD(name, type) \491 struct name { \492 struct type *tqh_first; /* first element */ \493 struct type **tqh_last; /* addr of last next element */ \494 TRACEBUF \495 } 496 497 #define TAILQ_HEAD_INITIALIZER(head) \490 #define TAILQ_HEAD(name, type) \ 491 struct name { \ 492 struct type *tqh_first; /* first element */ \ 493 struct type **tqh_last; /* addr of last next element */ \ 494 TRACEBUF \ 495 } 496 497 #define TAILQ_HEAD_INITIALIZER(head) \ 498 498 { NULL, &(head).tqh_first } 499 499 500 #define TAILQ_ENTRY(type) \501 struct { \502 struct type *tqe_next; /* next element */\503 struct type **tqe_prev; /* address of previous next element */ \504 TRACEBUF \500 #define TAILQ_ENTRY(type) \ 501 struct { \ 502 struct type *tqe_next; /* next element */ \ 503 struct type **tqe_prev; /* address of previous next element */ \ 504 TRACEBUF \ 505 505 } 506 506 … … 508 508 * Tail queue functions. 509 509 */ 510 #define TAILQ_CONCAT(head1, head2, field) do { \511 if (!TAILQ_EMPTY(head2)) { \512 *(head1)->tqh_last = (head2)->tqh_first; \510 #define TAILQ_CONCAT(head1, head2, field) do { \ 511 if (!TAILQ_EMPTY(head2)) { \ 512 *(head1)->tqh_last = (head2)->tqh_first; \ 513 513 (head2)->tqh_first->field.tqe_prev = (head1)->tqh_last; \ 514 (head1)->tqh_last = (head2)->tqh_last; \515 TAILQ_INIT((head2)); \516 QMD_TRACE_HEAD(head); \517 QMD_TRACE_HEAD(head2); \518 } \514 (head1)->tqh_last = (head2)->tqh_last; \ 515 TAILQ_INIT((head2)); \ 516 QMD_TRACE_HEAD(head); \ 517 QMD_TRACE_HEAD(head2); \ 518 } \ 519 519 } while (0) 520 520 … … 523 523 #define TAILQ_FIRST(head) ((head)->tqh_first) 524 524 525 #define TAILQ_FOREACH(var, head, field) \526 for ((var) = TAILQ_FIRST((head)); \527 (var); \525 #define TAILQ_FOREACH(var, head, field) \ 526 for ((var) = TAILQ_FIRST((head)); \ 527 (var); \ 528 528 (var) = TAILQ_NEXT((var), field)) 529 529 530 #define TAILQ_FOREACH_REVERSE(var, head, headname, field) \531 for ((var) = TAILQ_LAST((head), headname); \532 (var); \530 #define TAILQ_FOREACH_REVERSE(var, head, headname, field) \ 531 for ((var) = TAILQ_LAST((head), headname); \ 532 (var); \ 533 533 (var) = TAILQ_PREV((var), headname, field)) 534 534 535 #define TAILQ_INIT(head) do { \536 TAILQ_FIRST((head)) = NULL; \537 (head)->tqh_last = &TAILQ_FIRST((head)); \538 QMD_TRACE_HEAD(head); \539 } while (0) 540 541 #define TAILQ_INSERT_AFTER(head, listelm, elm, field) do { \542 if ((TAILQ_NEXT((elm), field) = TAILQ_NEXT((listelm), field)) != NULL) \543 TAILQ_NEXT((elm), field)->field.tqe_prev = \544 &TAILQ_NEXT((elm), field); \545 else { \546 (head)->tqh_last = &TAILQ_NEXT((elm), field); \547 QMD_TRACE_HEAD(head); \548 } \549 TAILQ_NEXT((listelm), field) = (elm); \550 (elm)->field.tqe_prev = &TAILQ_NEXT((listelm), field); \551 QMD_TRACE_ELEM(&(elm)->field); \552 QMD_TRACE_ELEM(&listelm->field); \553 } while (0) 554 555 #define TAILQ_INSERT_BEFORE(listelm, elm, field) do { \556 (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \557 TAILQ_NEXT((elm), field) = (listelm); \558 *(listelm)->field.tqe_prev = (elm); \559 (listelm)->field.tqe_prev = &TAILQ_NEXT((elm), field); \560 QMD_TRACE_ELEM(&(elm)->field); \561 QMD_TRACE_ELEM(&listelm->field); \535 #define TAILQ_INIT(head) do { \ 536 TAILQ_FIRST((head)) = NULL; \ 537 (head)->tqh_last = &TAILQ_FIRST((head)); \ 538 QMD_TRACE_HEAD(head); \ 539 } while (0) 540 541 #define TAILQ_INSERT_AFTER(head, listelm, elm, field) do { \ 542 if ((TAILQ_NEXT((elm), field) = TAILQ_NEXT((listelm), field)) != NULL) \ 543 TAILQ_NEXT((elm), field)->field.tqe_prev = \ 544 &TAILQ_NEXT((elm), field); \ 545 else { \ 546 (head)->tqh_last = &TAILQ_NEXT((elm), field); \ 547 QMD_TRACE_HEAD(head); \ 548 } \ 549 TAILQ_NEXT((listelm), field) = (elm); \ 550 (elm)->field.tqe_prev = &TAILQ_NEXT((listelm), field); \ 551 QMD_TRACE_ELEM(&(elm)->field); \ 552 QMD_TRACE_ELEM(&listelm->field); \ 553 } while (0) 554 555 #define TAILQ_INSERT_BEFORE(listelm, elm, field) do { \ 556 (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \ 557 TAILQ_NEXT((elm), field) = (listelm); \ 558 *(listelm)->field.tqe_prev = (elm); \ 559 (listelm)->field.tqe_prev = &TAILQ_NEXT((elm), field); \ 560 QMD_TRACE_ELEM(&(elm)->field); \ 561 QMD_TRACE_ELEM(&listelm->field); \ 562 562 } while (0) 563 563 564 564 #define TAILQ_INSERT_HEAD(head, elm, field) do { \ 565 if ((TAILQ_NEXT((elm), field) = TAILQ_FIRST((head))) != NULL) \566 TAILQ_FIRST((head))->field.tqe_prev = \567 &TAILQ_NEXT((elm), field); \568 else \569 (head)->tqh_last = &TAILQ_NEXT((elm), field); \570 TAILQ_FIRST((head)) = (elm); \571 (elm)->field.tqe_prev = &TAILQ_FIRST((head)); \572 QMD_TRACE_HEAD(head); \573 QMD_TRACE_ELEM(&(elm)->field); \565 if ((TAILQ_NEXT((elm), field) = TAILQ_FIRST((head))) != NULL) \ 566 TAILQ_FIRST((head))->field.tqe_prev = \ 567 &TAILQ_NEXT((elm), field); \ 568 else \ 569 (head)->tqh_last = &TAILQ_NEXT((elm), field); \ 570 TAILQ_FIRST((head)) = (elm); \ 571 (elm)->field.tqe_prev = &TAILQ_FIRST((head)); \ 572 QMD_TRACE_HEAD(head); \ 573 QMD_TRACE_ELEM(&(elm)->field); \ 574 574 } while (0) 575 575 576 576 #define TAILQ_INSERT_TAIL(head, elm, field) do { \ 577 TAILQ_NEXT((elm), field) = NULL; \578 (elm)->field.tqe_prev = (head)->tqh_last; \579 *(head)->tqh_last = (elm); \580 (head)->tqh_last = &TAILQ_NEXT((elm), field); \581 QMD_TRACE_HEAD(head); \582 QMD_TRACE_ELEM(&(elm)->field); \583 } while (0) 584 585 #define TAILQ_LAST(head, headname) \577 TAILQ_NEXT((elm), field) = NULL; \ 578 (elm)->field.tqe_prev = (head)->tqh_last; \ 579 *(head)->tqh_last = (elm); \ 580 (head)->tqh_last = &TAILQ_NEXT((elm), field); \ 581 QMD_TRACE_HEAD(head); \ 582 QMD_TRACE_ELEM(&(elm)->field); \ 583 } while (0) 584 585 #define TAILQ_LAST(head, headname) \ 586 586 (*(((struct headname *)((head)->tqh_last))->tqh_last)) 587 587 … … 591 591 (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last)) 592 592 593 #define TAILQ_REMOVE(head, elm, field) do { \593 #define TAILQ_REMOVE(head, elm, field) do { \ 594 594 if ((TAILQ_NEXT((elm), field)) != NULL) \ 595 TAILQ_NEXT((elm), field)->field.tqe_prev = \596 (elm)->field.tqe_prev; \597 else { \598 (head)->tqh_last = (elm)->field.tqe_prev; \599 QMD_TRACE_HEAD(head); \600 } \601 *(elm)->field.tqe_prev = TAILQ_NEXT((elm), field); \595 TAILQ_NEXT((elm), field)->field.tqe_prev = \ 596 (elm)->field.tqe_prev; \ 597 else { \ 598 (head)->tqh_last = (elm)->field.tqe_prev; \ 599 QMD_TRACE_HEAD(head); \ 600 } \ 601 *(elm)->field.tqe_prev = TAILQ_NEXT((elm), field); \ 602 602 TRASHIT((elm)->field.tqe_next); \ 603 603 TRASHIT((elm)->field.tqe_prev); \ 604 QMD_TRACE_ELEM(&(elm)->field); \604 QMD_TRACE_ELEM(&(elm)->field); \ 605 605 } while (0) 606 606
Note: See TracChangeset
for help on using the changeset viewer.
