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;
510insque(
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;
532void insque
__P((
void *
a,
void *
b));
533void remque
__P((
void *
a));