113 #define SLIST_HEAD(name, type) \ 115 struct type *slh_first; \ 118 #define SLIST_HEAD_INITIALIZER(head) \ 121 #define SLIST_ENTRY(type) \ 123 struct type *sle_next; \ 129 #define SLIST_EMPTY(head) ((head)->slh_first == NULL) 131 #define SLIST_FIRST(head) ((head)->slh_first) 133 #define SLIST_FOREACH(var, head, field) \ 134 for((var) = (head)->slh_first; (var); (var) = (var)->field.sle_next) 136 #define SLIST_INIT(head) { \ 137 (head)->slh_first = NULL; \ 140 #define SLIST_INSERT_AFTER(slistelm, elm, field) do { \ 141 (elm)->field.sle_next = (slistelm)->field.sle_next; \ 142 (slistelm)->field.sle_next = (elm); \ 145 #define SLIST_INSERT_HEAD(head, elm, field) do { \ 146 (elm)->field.sle_next = (head)->slh_first; \ 147 (head)->slh_first = (elm); \ 150 #define SLIST_NEXT(elm, field) ((elm)->field.sle_next) 152 #define SLIST_REMOVE_HEAD(head, field) do { \ 153 (head)->slh_first = (head)->slh_first->field.sle_next; \ 156 #define SLIST_REMOVE(head, elm, type, field) do { \ 157 if ((head)->slh_first == (elm)) { \ 158 SLIST_REMOVE_HEAD((head), field); \ 161 struct type *curelm = (head)->slh_first; \ 162 while( curelm->field.sle_next != (elm) ) \ 163 curelm = curelm->field.sle_next; \ 164 curelm->field.sle_next = \ 165 curelm->field.sle_next->field.sle_next; \ 172 #define STAILQ_HEAD(name, type) \ 174 struct type *stqh_first; \ 175 struct type **stqh_last; \ 178 #define STAILQ_HEAD_INITIALIZER(head) \ 179 { NULL, &(head).stqh_first } 181 #define STAILQ_ENTRY(type) \ 183 struct type *stqe_next; \ 189 #define STAILQ_EMPTY(head) ((head)->stqh_first == NULL) 191 #define STAILQ_INIT(head) do { \ 192 (head)->stqh_first = NULL; \ 193 (head)->stqh_last = &(head)->stqh_first; \ 196 #define STAILQ_FIRST(head) ((head)->stqh_first) 197 #define STAILQ_LAST(head) (*(head)->stqh_last) 199 #define STAILQ_FOREACH(var, head, field) \ 200 for((var) = (head)->stqh_first; (var); (var) = (var)->field.stqe_next) 202 #define STAILQ_INSERT_HEAD(head, elm, field) do { \ 203 if (((elm)->field.stqe_next = (head)->stqh_first) == NULL) \ 204 (head)->stqh_last = &(elm)->field.stqe_next; \ 205 (head)->stqh_first = (elm); \ 208 #define STAILQ_INSERT_TAIL(head, elm, field) do { \ 209 (elm)->field.stqe_next = NULL; \ 210 *(head)->stqh_last = (elm); \ 211 (head)->stqh_last = &(elm)->field.stqe_next; \ 214 #define STAILQ_INSERT_AFTER(head, tqelm, elm, field) do { \ 215 if (((elm)->field.stqe_next = (tqelm)->field.stqe_next) == NULL)\ 216 (head)->stqh_last = &(elm)->field.stqe_next; \ 217 (tqelm)->field.stqe_next = (elm); \ 220 #define STAILQ_NEXT(elm, field) ((elm)->field.stqe_next) 222 #define STAILQ_REMOVE_HEAD(head, field) do { \ 223 if (((head)->stqh_first = \ 224 (head)->stqh_first->field.stqe_next) == NULL) \ 225 (head)->stqh_last = &(head)->stqh_first; \ 228 #define STAILQ_REMOVE_HEAD_UNTIL(head, elm, field) do { \ 229 if (((head)->stqh_first = (elm)->field.stqe_next) == NULL) \ 230 (head)->stqh_last = &(head)->stqh_first; \ 233 #define STAILQ_REMOVE(head, elm, type, field) do { \ 234 if ((head)->stqh_first == (elm)) { \ 235 STAILQ_REMOVE_HEAD(head, field); \ 238 struct type *curelm = (head)->stqh_first; \ 239 while( curelm->field.stqe_next != (elm) ) \ 240 curelm = curelm->field.stqe_next; \ 241 if((curelm->field.stqe_next = \ 242 curelm->field.stqe_next->field.stqe_next) == NULL) \ 243 (head)->stqh_last = &(curelm)->field.stqe_next; \ 250 #define LIST_HEAD(name, type) \ 252 struct type *lh_first; \ 255 #define LIST_HEAD_INITIALIZER(head) \ 258 #define LIST_ENTRY(type) \ 260 struct type *le_next; \ 261 struct type **le_prev; \ 268 #define LIST_EMPTY(head) ((head)->lh_first == NULL) 270 #define LIST_FIRST(head) ((head)->lh_first) 272 #define LIST_FOREACH(var, head, field) \ 273 for((var) = (head)->lh_first; (var); (var) = (var)->field.le_next) 275 #define LIST_INIT(head) do { \ 276 (head)->lh_first = NULL; \ 279 #define LIST_INSERT_AFTER(listelm, elm, field) do { \ 280 if (((elm)->field.le_next = (listelm)->field.le_next) != NULL) \ 281 (listelm)->field.le_next->field.le_prev = \ 282 &(elm)->field.le_next; \ 283 (listelm)->field.le_next = (elm); \ 284 (elm)->field.le_prev = &(listelm)->field.le_next; \ 287 #define LIST_INSERT_BEFORE(listelm, elm, field) do { \ 288 (elm)->field.le_prev = (listelm)->field.le_prev; \ 289 (elm)->field.le_next = (listelm); \ 290 *(listelm)->field.le_prev = (elm); \ 291 (listelm)->field.le_prev = &(elm)->field.le_next; \ 294 #define LIST_INSERT_HEAD(head, elm, field) do { \ 295 if (((elm)->field.le_next = (head)->lh_first) != NULL) \ 296 (head)->lh_first->field.le_prev = &(elm)->field.le_next;\ 297 (head)->lh_first = (elm); \ 298 (elm)->field.le_prev = &(head)->lh_first; \ 301 #define LIST_NEXT(elm, field) ((elm)->field.le_next) 303 #define LIST_REMOVE(elm, field) do { \ 304 if ((elm)->field.le_next != NULL) \ 305 (elm)->field.le_next->field.le_prev = \ 306 (elm)->field.le_prev; \ 307 *(elm)->field.le_prev = (elm)->field.le_next; \ 313 #define TAILQ_HEAD(name, type) \ 315 struct type *tqh_first; \ 316 struct type **tqh_last; \ 319 #define TAILQ_HEAD_INITIALIZER(head) \ 320 { NULL, &(head).tqh_first } 322 #define TAILQ_ENTRY(type) \ 324 struct type *tqe_next; \ 325 struct type **tqe_prev; \ 331 #define TAILQ_EMPTY(head) ((head)->tqh_first == NULL) 333 #define TAILQ_FOREACH(var, head, field) \ 334 for (var = TAILQ_FIRST(head); var; var = TAILQ_NEXT(var, field)) 336 #define TAILQ_FOREACH_REVERSE(var, head, headname, field) \ 337 for ((var) = TAILQ_LAST((head), headname); \ 339 (var) = TAILQ_PREV((var), headname, field)) 341 #define TAILQ_FIRST(head) ((head)->tqh_first) 343 #define TAILQ_LAST(head, headname) \ 344 (*(((struct headname *)((head)->tqh_last))->tqh_last)) 346 #define TAILQ_NEXT(elm, field) ((elm)->field.tqe_next) 348 #define TAILQ_PREV(elm, headname, field) \ 349 (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last)) 351 #define TAILQ_INIT(head) do { \ 352 (head)->tqh_first = NULL; \ 353 (head)->tqh_last = &(head)->tqh_first; \ 356 #define TAILQ_INSERT_HEAD(head, elm, field) do { \ 357 if (((elm)->field.tqe_next = (head)->tqh_first) != NULL) \ 358 (head)->tqh_first->field.tqe_prev = \ 359 &(elm)->field.tqe_next; \ 361 (head)->tqh_last = &(elm)->field.tqe_next; \ 362 (head)->tqh_first = (elm); \ 363 (elm)->field.tqe_prev = &(head)->tqh_first; \ 366 #define TAILQ_INSERT_TAIL(head, elm, field) do { \ 367 (elm)->field.tqe_next = NULL; \ 368 (elm)->field.tqe_prev = (head)->tqh_last; \ 369 *(head)->tqh_last = (elm); \ 370 (head)->tqh_last = &(elm)->field.tqe_next; \ 373 #define TAILQ_INSERT_AFTER(head, listelm, elm, field) do { \ 374 if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != NULL)\ 375 (elm)->field.tqe_next->field.tqe_prev = \ 376 &(elm)->field.tqe_next; \ 378 (head)->tqh_last = &(elm)->field.tqe_next; \ 379 (listelm)->field.tqe_next = (elm); \ 380 (elm)->field.tqe_prev = &(listelm)->field.tqe_next; \ 383 #define TAILQ_INSERT_BEFORE(listelm, elm, field) do { \ 384 (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \ 385 (elm)->field.tqe_next = (listelm); \ 386 *(listelm)->field.tqe_prev = (elm); \ 387 (listelm)->field.tqe_prev = &(elm)->field.tqe_next; \ 390 #define TAILQ_REMOVE(head, elm, field) do { \ 391 if (((elm)->field.tqe_next) != NULL) \ 392 (elm)->field.tqe_next->field.tqe_prev = \ 393 (elm)->field.tqe_prev; \ 395 (head)->tqh_last = (elm)->field.tqe_prev; \ 396 *(elm)->field.tqe_prev = (elm)->field.tqe_next; \ 402 #define CIRCLEQ_HEAD(name, type) \ 404 struct type *cqh_first; \ 405 struct type *cqh_last; \ 408 #define CIRCLEQ_ENTRY(type) \ 410 struct type *cqe_next; \ 411 struct type *cqe_prev; \ 417 #define CIRCLEQ_EMPTY(head) ((head)->cqh_first == (void *)(head)) 419 #define CIRCLEQ_FIRST(head) ((head)->cqh_first) 421 #define CIRCLEQ_FOREACH(var, head, field) \ 422 for((var) = (head)->cqh_first; \ 423 (var) != (void *)(head); \ 424 (var) = (var)->field.cqe_next) 426 #define CIRCLEQ_FOREACH_REVERSE(var, head, field) \ 427 for((var) = (head)->cqh_last; \ 428 (var) != (void *)(head); \ 429 (var) = (var)->field.cqe_prev) 431 #define CIRCLEQ_INIT(head) do { \ 432 (head)->cqh_first = (void *)(head); \ 433 (head)->cqh_last = (void *)(head); \ 436 #define CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) do { \ 437 (elm)->field.cqe_next = (listelm)->field.cqe_next; \ 438 (elm)->field.cqe_prev = (listelm); \ 439 if ((listelm)->field.cqe_next == (void *)(head)) \ 440 (head)->cqh_last = (elm); \ 442 (listelm)->field.cqe_next->field.cqe_prev = (elm); \ 443 (listelm)->field.cqe_next = (elm); \ 446 #define CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) do { \ 447 (elm)->field.cqe_next = (listelm); \ 448 (elm)->field.cqe_prev = (listelm)->field.cqe_prev; \ 449 if ((listelm)->field.cqe_prev == (void *)(head)) \ 450 (head)->cqh_first = (elm); \ 452 (listelm)->field.cqe_prev->field.cqe_next = (elm); \ 453 (listelm)->field.cqe_prev = (elm); \ 456 #define CIRCLEQ_INSERT_HEAD(head, elm, field) do { \ 457 (elm)->field.cqe_next = (head)->cqh_first; \ 458 (elm)->field.cqe_prev = (void *)(head); \ 459 if ((head)->cqh_last == (void *)(head)) \ 460 (head)->cqh_last = (elm); \ 462 (head)->cqh_first->field.cqe_prev = (elm); \ 463 (head)->cqh_first = (elm); \ 466 #define CIRCLEQ_INSERT_TAIL(head, elm, field) do { \ 467 (elm)->field.cqe_next = (void *)(head); \ 468 (elm)->field.cqe_prev = (head)->cqh_last; \ 469 if ((head)->cqh_first == (void *)(head)) \ 470 (head)->cqh_first = (elm); \ 472 (head)->cqh_last->field.cqe_next = (elm); \ 473 (head)->cqh_last = (elm); \ 476 #define CIRCLEQ_LAST(head) ((head)->cqh_last) 478 #define CIRCLEQ_NEXT(elm,field) ((elm)->field.cqe_next) 480 #define CIRCLEQ_PREV(elm,field) ((elm)->field.cqe_prev) 482 #define CIRCLEQ_REMOVE(head, elm, field) do { \ 483 if ((elm)->field.cqe_next == (void *)(head)) \ 484 (head)->cqh_last = (elm)->field.cqe_prev; \ 486 (elm)->field.cqe_next->field.cqe_prev = \ 487 (elm)->field.cqe_prev; \ 488 if ((elm)->field.cqe_prev == (void *)(head)) \ 489 (head)->cqh_first = (elm)->field.cqe_next; \ 491 (elm)->field.cqe_prev->field.cqe_next = \ 492 (elm)->field.cqe_next; \ 503 struct quehead *qh_link;
504 struct quehead *qh_rlink;
510 insque(
void *
a,
void *
b)
512 struct quehead *element =
a, *head =
b;
514 element->qh_link = head->qh_link;
515 element->qh_rlink = head;
516 head->qh_link = element;
517 element->qh_link->qh_rlink = element;
523 struct quehead *element =
a;
525 element->qh_link->qh_rlink = element->qh_rlink;
526 element->qh_rlink->qh_link = element->qh_link;
527 element->qh_rlink = 0;
532 void insque
__P((
void *
a,
void *
b));
533 void remque
__P((
void *
a));