109 #define SLIST_HEAD(name, type) \ 111 struct type *slh_first; \ 114 #define SLIST_HEAD_INITIALIZER(head) \ 117 #define SLIST_ENTRY(type) \ 119 struct type *sle_next; \ 125 #define SLIST_EMPTY(head) ((head)->slh_first == NULL) 127 #define SLIST_FIRST(head) ((head)->slh_first) 129 #define SLIST_FOREACH(var, head, field) \ 130 for ((var) = SLIST_FIRST((head)); \ 132 (var) = SLIST_NEXT((var), field)) 134 #define SLIST_INIT(head) do { \ 135 SLIST_FIRST((head)) = NULL; \ 138 #define SLIST_INSERT_AFTER(slistelm, elm, field) do { \ 139 SLIST_NEXT((elm), field) = SLIST_NEXT((slistelm), field); \ 140 SLIST_NEXT((slistelm), field) = (elm); \ 143 #define SLIST_INSERT_HEAD(head, elm, field) do { \ 144 SLIST_NEXT((elm), field) = SLIST_FIRST((head)); \ 145 SLIST_FIRST((head)) = (elm); \ 148 #define SLIST_NEXT(elm, field) ((elm)->field.sle_next) 150 #define SLIST_REMOVE(head, elm, type, field) do { \ 151 if (SLIST_FIRST((head)) == (elm)) { \ 152 SLIST_REMOVE_HEAD((head), field); \ 155 struct type *curelm = SLIST_FIRST((head)); \ 156 while (SLIST_NEXT(curelm, field) != (elm)) \ 157 curelm = SLIST_NEXT(curelm, field); \ 158 SLIST_NEXT(curelm, field) = \ 159 SLIST_NEXT(SLIST_NEXT(curelm, field), field); \ 163 #define SLIST_REMOVE_HEAD(head, field) do { \ 164 SLIST_FIRST((head)) = SLIST_NEXT(SLIST_FIRST((head)), field); \ 170 #define STAILQ_HEAD(name, type) \ 172 struct type *stqh_first; \ 173 struct type **stqh_last; \ 176 #define STAILQ_HEAD_INITIALIZER(head) \ 177 { NULL, &(head).stqh_first } 179 #define STAILQ_ENTRY(type) \ 181 struct type *stqe_next; \ 187 #define STAILQ_CONCAT(head1, head2) do { \ 188 if (!STAILQ_EMPTY((head2))) { \ 189 *(head1)->stqh_last = (head2)->stqh_first; \ 190 (head1)->stqh_last = (head2)->stqh_last; \ 191 STAILQ_INIT((head2)); \ 195 #define STAILQ_EMPTY(head) ((head)->stqh_first == NULL) 197 #define STAILQ_FIRST(head) ((head)->stqh_first) 199 #define STAILQ_FOREACH(var, head, field) \ 200 for((var) = STAILQ_FIRST((head)); \ 202 (var) = STAILQ_NEXT((var), field)) 204 #define STAILQ_INIT(head) do { \ 205 STAILQ_FIRST((head)) = NULL; \ 206 (head)->stqh_last = &STAILQ_FIRST((head)); \ 209 #define STAILQ_INSERT_AFTER(head, tqelm, elm, field) do { \ 210 if ((STAILQ_NEXT((elm), field) = STAILQ_NEXT((tqelm), field)) == NULL)\ 211 (head)->stqh_last = &STAILQ_NEXT((elm), field); \ 212 STAILQ_NEXT((tqelm), field) = (elm); \ 215 #define STAILQ_INSERT_HEAD(head, elm, field) do { \ 216 if ((STAILQ_NEXT((elm), field) = STAILQ_FIRST((head))) == NULL) \ 217 (head)->stqh_last = &STAILQ_NEXT((elm), field); \ 218 STAILQ_FIRST((head)) = (elm); \ 221 #define STAILQ_INSERT_TAIL(head, elm, field) do { \ 222 STAILQ_NEXT((elm), field) = NULL; \ 223 *(head)->stqh_last = (elm); \ 224 (head)->stqh_last = &STAILQ_NEXT((elm), field); \ 227 #define STAILQ_LAST(head, type, field) \ 228 (STAILQ_EMPTY((head)) ? \ 231 ((char *)((head)->stqh_last) - __offsetof(struct type, field)))) 233 #define STAILQ_NEXT(elm, field) ((elm)->field.stqe_next) 235 #define STAILQ_REMOVE(head, elm, type, field) do { \ 236 if (STAILQ_FIRST((head)) == (elm)) { \ 237 STAILQ_REMOVE_HEAD((head), field); \ 240 struct type *curelm = STAILQ_FIRST((head)); \ 241 while (STAILQ_NEXT(curelm, field) != (elm)) \ 242 curelm = STAILQ_NEXT(curelm, field); \ 243 if ((STAILQ_NEXT(curelm, field) = \ 244 STAILQ_NEXT(STAILQ_NEXT(curelm, field), field)) == NULL)\ 245 (head)->stqh_last = &STAILQ_NEXT((curelm), field);\ 249 #define STAILQ_REMOVE_HEAD(head, field) do { \ 250 if ((STAILQ_FIRST((head)) = \ 251 STAILQ_NEXT(STAILQ_FIRST((head)), field)) == NULL) \ 252 (head)->stqh_last = &STAILQ_FIRST((head)); \ 255 #define STAILQ_REMOVE_HEAD_UNTIL(head, elm, field) do { \ 256 if ((STAILQ_FIRST((head)) = STAILQ_NEXT((elm), field)) == NULL) \ 257 (head)->stqh_last = &STAILQ_FIRST((head)); \ 263 #define LIST_HEAD(name, type) \ 265 struct type *lh_first; \ 268 #define LIST_HEAD_INITIALIZER(head) \ 271 #define LIST_ENTRY(type) \ 273 struct type *le_next; \ 274 struct type **le_prev; \ 281 #define LIST_EMPTY(head) ((head)->lh_first == NULL) 283 #define LIST_FIRST(head) ((head)->lh_first) 285 #define LIST_FOREACH(var, head, field) \ 286 for ((var) = LIST_FIRST((head)); \ 288 (var) = LIST_NEXT((var), field)) 290 #define LIST_INIT(head) do { \ 291 LIST_FIRST((head)) = NULL; \ 294 #define LIST_INSERT_AFTER(listelm, elm, field) do { \ 295 if ((LIST_NEXT((elm), field) = LIST_NEXT((listelm), field)) != NULL)\ 296 LIST_NEXT((listelm), field)->field.le_prev = \ 297 &LIST_NEXT((elm), field); \ 298 LIST_NEXT((listelm), field) = (elm); \ 299 (elm)->field.le_prev = &LIST_NEXT((listelm), field); \ 302 #define LIST_INSERT_BEFORE(listelm, elm, field) do { \ 303 (elm)->field.le_prev = (listelm)->field.le_prev; \ 304 LIST_NEXT((elm), field) = (listelm); \ 305 *(listelm)->field.le_prev = (elm); \ 306 (listelm)->field.le_prev = &LIST_NEXT((elm), field); \ 309 #define LIST_INSERT_HEAD(head, elm, field) do { \ 310 if ((LIST_NEXT((elm), field) = LIST_FIRST((head))) != NULL) \ 311 LIST_FIRST((head))->field.le_prev = &LIST_NEXT((elm), field);\ 312 LIST_FIRST((head)) = (elm); \ 313 (elm)->field.le_prev = &LIST_FIRST((head)); \ 316 #define LIST_NEXT(elm, field) ((elm)->field.le_next) 318 #define LIST_REMOVE(elm, field) do { \ 319 if (LIST_NEXT((elm), field) != NULL) \ 320 LIST_NEXT((elm), field)->field.le_prev = \ 321 (elm)->field.le_prev; \ 322 *(elm)->field.le_prev = LIST_NEXT((elm), field); \ 328 #define TAILQ_HEAD(name, type) \ 330 struct type *tqh_first; \ 331 struct type **tqh_last; \ 334 #define TAILQ_HEAD_INITIALIZER(head) \ 335 { NULL, &(head).tqh_first } 337 #define TAILQ_ENTRY(type) \ 339 struct type *tqe_next; \ 340 struct type **tqe_prev; \ 346 #define TAILQ_CONCAT(head1, head2, field) do { \ 347 if (!TAILQ_EMPTY(head2)) { \ 348 *(head1)->tqh_last = (head2)->tqh_first; \ 349 (head2)->tqh_first->field.tqe_prev = (head1)->tqh_last; \ 350 (head1)->tqh_last = (head2)->tqh_last; \ 351 TAILQ_INIT((head2)); \ 355 #define TAILQ_EMPTY(head) ((head)->tqh_first == NULL) 357 #define TAILQ_FIRST(head) ((head)->tqh_first) 359 #define TAILQ_FOREACH(var, head, field) \ 360 for ((var) = TAILQ_FIRST((head)); \ 362 (var) = TAILQ_NEXT((var), field)) 364 #define TAILQ_FOREACH_REVERSE(var, head, headname, field) \ 365 for ((var) = TAILQ_LAST((head), headname); \ 367 (var) = TAILQ_PREV((var), headname, field)) 369 #define TAILQ_INIT(head) do { \ 370 TAILQ_FIRST((head)) = NULL; \ 371 (head)->tqh_last = &TAILQ_FIRST((head)); \ 374 #define TAILQ_INSERT_AFTER(head, listelm, elm, field) do { \ 375 if ((TAILQ_NEXT((elm), field) = TAILQ_NEXT((listelm), field)) != NULL)\ 376 TAILQ_NEXT((elm), field)->field.tqe_prev = \ 377 &TAILQ_NEXT((elm), field); \ 379 (head)->tqh_last = &TAILQ_NEXT((elm), field); \ 380 TAILQ_NEXT((listelm), field) = (elm); \ 381 (elm)->field.tqe_prev = &TAILQ_NEXT((listelm), field); \ 384 #define TAILQ_INSERT_BEFORE(listelm, elm, field) do { \ 385 (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \ 386 TAILQ_NEXT((elm), field) = (listelm); \ 387 *(listelm)->field.tqe_prev = (elm); \ 388 (listelm)->field.tqe_prev = &TAILQ_NEXT((elm), field); \ 391 #define TAILQ_INSERT_HEAD(head, elm, field) do { \ 392 if ((TAILQ_NEXT((elm), field) = TAILQ_FIRST((head))) != NULL) \ 393 TAILQ_FIRST((head))->field.tqe_prev = \ 394 &TAILQ_NEXT((elm), field); \ 396 (head)->tqh_last = &TAILQ_NEXT((elm), field); \ 397 TAILQ_FIRST((head)) = (elm); \ 398 (elm)->field.tqe_prev = &TAILQ_FIRST((head)); \ 401 #define TAILQ_INSERT_TAIL(head, elm, field) do { \ 402 TAILQ_NEXT((elm), field) = NULL; \ 403 (elm)->field.tqe_prev = (head)->tqh_last; \ 404 *(head)->tqh_last = (elm); \ 405 (head)->tqh_last = &TAILQ_NEXT((elm), field); \ 408 #define TAILQ_LAST(head, headname) \ 409 (*(((struct headname *)((head)->tqh_last))->tqh_last)) 411 #define TAILQ_NEXT(elm, field) ((elm)->field.tqe_next) 413 #define TAILQ_PREV(elm, headname, field) \ 414 (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last)) 416 #define TAILQ_REMOVE(head, elm, field) do { \ 417 if ((TAILQ_NEXT((elm), field)) != NULL) \ 418 TAILQ_NEXT((elm), field)->field.tqe_prev = \ 419 (elm)->field.tqe_prev; \ 421 (head)->tqh_last = (elm)->field.tqe_prev; \ 422 *(elm)->field.tqe_prev = TAILQ_NEXT((elm), field); \ 434 struct quehead *qh_link;
435 struct quehead *qh_rlink;
441 insque(
void *a,
void *b)
443 struct quehead *element = (
struct quehead *)a,
444 *head = (
struct quehead *)b;
446 element->qh_link = head->qh_link;
447 element->qh_rlink = head;
448 head->qh_link = element;
449 element->qh_link->qh_rlink = element;
455 struct quehead *element = (
struct quehead *)a;
457 element->qh_link->qh_rlink = element->qh_rlink;
458 element->qh_rlink->qh_link = element->qh_link;
459 element->qh_rlink = 0;
464 void insque(
void *a,
void *b);
465 void remque(
void *a);