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));