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