/*
 * Copyright (c) 1991, 1993
 *    The Regents of the University of California.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 4. Neither the name of the University nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 *    @(#)queue.h    8.5 (Berkeley) 8/20/94
 * $FreeBSD: src/sys/sys/queue.h,v 1.58 2004/04/07 04:19:49 imp Exp $
 */

#if !defined(__NetBSD__)
#ifndef _SYS_QUEUE_H_
#define    _SYS_QUEUE_H_

/*
 * This file defines four types of data structures: singly-linked lists,
 * singly-linked tail queues, lists and tail queues.
 *
 * A singly-linked list is headed by a single forward pointer. The elements
 * are singly linked for minimum space and pointer manipulation overhead at
 * the expense of O(n) removal for arbitrary elements. New elements can be
 * added to the list after an existing element or at the head of the list.
 * Elements being removed from the head of the list should use the explicit
 * macro for this purpose for optimum efficiency. A singly-linked list may
 * only be traversed in the forward direction.  Singly-linked lists are ideal
 * for applications with large datasets and few or no removals or for
 * implementing a LIFO queue.
 *
 * A singly-linked tail queue is headed by a pair of pointers, one to the
 * head of the list and the other to the tail of the list. The elements are
 * singly linked for minimum space and pointer manipulation overhead at the
 * expense of O(n) removal for arbitrary elements. New elements can be added
 * to the list after an existing element, at the head of the list, or at the
 * end of the list. Elements being removed from the head of the tail queue
 * should use the explicit macro for this purpose for optimum efficiency.
 * A singly-linked tail queue may only be traversed in the forward direction.
 * Singly-linked tail queues are ideal for applications with large datasets
 * and few or no removals or for implementing a FIFO queue.
 *
 * A list is headed by a single forward pointer (or an array of forward
 * pointers for a hash table header). The elements are doubly linked
 * so that an arbitrary element can be removed without a need to
 * traverse the list. New elements can be added to the list before
 * or after an existing element or at the head of the list. A list
 * may only be traversed in the forward direction.
 *
 * A tail queue is headed by a pair of pointers, one to the head of the
 * list and the other to the tail of the list. The elements are doubly
 * linked so that an arbitrary element can be removed without a need to
 * traverse the list. New elements can be added to the list before or
 * after an existing element, at the head of the list, or at the end of
 * the list. A tail queue may be traversed in either direction.
 *
 * For details on the use of these macros, see the queue(3) manual page.
 *
 *
 *                SLIST    LIST    STAILQ    TAILQ
 * _HEAD            +    +    +    +
 * _HEAD_INITIALIZER        +    +    +    +
 * _ENTRY            +    +    +    +
 * _INIT            +    +    +    +
 * _EMPTY            +    +    +    +
 * _FIRST            +    +    +    +
 * _NEXT            +    +    +    +
 * _PREV            -    -    -    +
 * _LAST            -    -    +    +
 * _FOREACH            +    +    +    +
 * _FOREACH_SAFE        +    +    +    +
 * _FOREACH_REVERSE        -    -    -    +
 * _FOREACH_REVERSE_SAFE    -    -    -    +
 * _INSERT_HEAD            +    +    +    +
 * _INSERT_BEFORE        -    +    -    +
 * _INSERT_AFTER        +    +    +    +
 * _INSERT_TAIL            -    -    +    +
 * _CONCAT            -    -    +    +
 * _REMOVE_HEAD            +    -    +    -
 * _REMOVE            +    +    +    +
 *
 */
#define    QUEUE_MACRO_DEBUG 0
#if QUEUE_MACRO_DEBUG
/* Store the last 2 places the queue element or head was altered */
struct qm_trace {
    char * lastfile;
    int lastline;
    char * prevfile;
    int prevline;
};

#define    TRACEBUF    struct qm_trace trace;
#define    TRASHIT(x)    do {(x) = (void *)NULL;} while (0)

#define    QMD_TRACE_HEAD(head) do {                    \
    (head)->trace.prevline = (head)->trace.lastline;        \
    (head)->trace.prevfile = (head)->trace.lastfile;        \
    (head)->trace.lastline = __LINE__;                \
    (head)->trace.lastfile = __FILE__;                \
} while (0)

#define    QMD_TRACE_ELEM(elem) do {                    \
    (elem)->trace.prevline = (elem)->trace.lastline;        \
    (elem)->trace.prevfile = (elem)->trace.lastfile;        \
    (elem)->trace.lastline = __LINE__;                \
    (elem)->trace.lastfile = __FILE__;                \
} while (0)

#else
#define    QMD_TRACE_ELEM(elem)
#define    QMD_TRACE_HEAD(head)
#define    TRACEBUF
#define TRASHIT(x) do {(x) = (void *)0;} while (0)
#endif    /* QUEUE_MACRO_DEBUG */

#ifdef ATHR_RNWF
/* NDIS contains a defn for SLIST_ENTRY and SINGLE_LIST_ENTRY */
#endif

/*
 * Singly-linked List declarations.
 */
#define    SLIST_HEAD(name, type)                        \
struct name {                                \
    struct type *slh_first;    /* first element */            \
}

#define    SLIST_HEAD_INITIALIZER(head)                    \
    { NULL }

#define    SING_LIST_ENTRY(type)                        \
struct {                                \
    struct type *sle_next;    /* next element */            \
}

/*
 * Singly-linked List functions.
 */
#define    SLIST_EMPTY(head)    ((head)->slh_first == NULL)

#define    SLIST_FIRST(head)    ((head)->slh_first)

#define    SLIST_FOREACH(var, head, field)                    \
    for ((var) = SLIST_FIRST((head));                \
        (var);                            \
        (var) = SLIST_NEXT((var), field))

#define    SLIST_FOREACH_SAFE(var, head, field, tvar)            \
    for ((var) = SLIST_FIRST((head));                \
        (var) && ((tvar) = SLIST_NEXT((var), field), 1);        \
        (var) = (tvar))

#define    SLIST_FOREACH_PREVPTR(var, varp, head, field)            \
    for ((varp) = &SLIST_FIRST((head));                \
        ((var) = *(varp)) != NULL;                    \
        (varp) = &SLIST_NEXT((var), field))

#define    SLIST_INIT(head) do {                        \
    SLIST_FIRST((head)) = NULL;                    \
} while (0)

#define    SLIST_INSERT_AFTER(slistelm, elm, field) do {            \
    SLIST_NEXT((elm), field) = SLIST_NEXT((slistelm), field);    \
    SLIST_NEXT((slistelm), field) = (elm);                \
} while (0)

#define    SLIST_INSERT_HEAD(head, elm, field) do {            \
    SLIST_NEXT((elm), field) = SLIST_FIRST((head));            \
    SLIST_FIRST((head)) = (elm);                    \
} while (0)

#define    SLIST_NEXT(elm, field)    ((elm)->field.sle_next)

#define    SLIST_REMOVE(head, elm, type, field) do {            \
    if (SLIST_FIRST((head)) == (elm)) {                \
        SLIST_REMOVE_HEAD((head), field);            \
    }                                \
    else {                                \
        struct type *curelm = SLIST_FIRST((head));        \
        while (SLIST_NEXT(curelm, field) != (elm))        \
            curelm = SLIST_NEXT(curelm, field);        \
        SLIST_NEXT(curelm, field) =                \
            SLIST_NEXT(SLIST_NEXT(curelm, field), field);    \
    }                                \
} while (0)

#define    SLIST_REMOVE_HEAD(head, field) do {                \
    SLIST_FIRST((head)) = SLIST_NEXT(SLIST_FIRST((head)), field);    \
} while (0)

/*
 * Singly-linked Tail queue declarations.
 */
#define    STAILQ_HEAD(name, type)                        \
struct name {                                \
    struct type *stqh_first;/* first element */            \
    struct type **stqh_last;/* addr of last next element */        \
}

#define    STAILQ_HEAD_INITIALIZER(head)                    \
    { NULL, &(head).stqh_first }

#define    STAILQ_ENTRY(type)                        \
struct {                                \
    struct type *stqe_next;    /* next element */            \
}

/*
 * Singly-linked Tail queue functions.
 */
#define    STAILQ_CONCAT(head1, head2) do {                \
    if (!STAILQ_EMPTY((head2))) {                    \
        *(head1)->stqh_last = (head2)->stqh_first;        \
        (head1)->stqh_last = (head2)->stqh_last;        \
        STAILQ_INIT((head2));                    \
    }                                \
} while (0)

#define    STAILQ_EMPTY(head)    ((head)->stqh_first == NULL)

#define    STAILQ_FIRST(head)    ((head)->stqh_first)

#define    STAILQ_FOREACH(var, head, field)                \
    for((var) = STAILQ_FIRST((head));                \
       (var);                            \
       (var) = STAILQ_NEXT((var), field))


#define    STAILQ_FOREACH_SAFE(var, head, field, tvar)            \
    for ((var) = STAILQ_FIRST((head));                \
        (var) && ((tvar) = STAILQ_NEXT((var), field), 1);        \
        (var) = (tvar))

#define    STAILQ_INIT(head) do {                        \
    STAILQ_FIRST((head)) = NULL;                    \
    (head)->stqh_last = &STAILQ_FIRST((head));            \
} while (0)

#define    STAILQ_INSERT_AFTER(head, tqelm, elm, field) do {        \
    if ((STAILQ_NEXT((elm), field) = STAILQ_NEXT((tqelm), field)) == NULL)\
        (head)->stqh_last = &STAILQ_NEXT((elm), field);        \
    STAILQ_NEXT((tqelm), field) = (elm);                \
} while (0)

#define    STAILQ_INSERT_HEAD(head, elm, field) do {            \
    if ((STAILQ_NEXT((elm), field) = STAILQ_FIRST((head))) == NULL)    \
        (head)->stqh_last = &STAILQ_NEXT((elm), field);        \
    STAILQ_FIRST((head)) = (elm);                    \
} while (0)

#define    STAILQ_INSERT_TAIL(head, elm, field) do {            \
    STAILQ_NEXT((elm), field) = NULL;                \
    *(head)->stqh_last = (elm);                    \
    (head)->stqh_last = &STAILQ_NEXT((elm), field);            \
} while (0)

#define    STAILQ_LAST(head, type, field)                    \
    (STAILQ_EMPTY((head)) ?                        \
        NULL :                            \
            ((struct type *)                    \
        ((char *)((head)->stqh_last) - __offsetof(struct type, field))))

#define    STAILQ_NEXT(elm, field)    ((elm)->field.stqe_next)

#define    STAILQ_REMOVE(head, elm, type, field) do {            \
    if (STAILQ_FIRST((head)) == (elm)) {                \
        STAILQ_REMOVE_HEAD((head), field);            \
    }                                \
    else {                                \
        struct type *curelm = STAILQ_FIRST((head));        \
        while (STAILQ_NEXT(curelm, field) != (elm))        \
            curelm = STAILQ_NEXT(curelm, field);        \
        if ((STAILQ_NEXT(curelm, field) =            \
             STAILQ_NEXT(STAILQ_NEXT(curelm, field), field)) == NULL)\
            (head)->stqh_last = &STAILQ_NEXT((curelm), field);\
    }                                \
} while (0)


#define    STAILQ_REMOVE_AFTER(head, elm, field) do {            \
    if (STAILQ_NEXT(elm, field)) {        \
        if ((STAILQ_NEXT(elm, field) =            \
             STAILQ_NEXT(STAILQ_NEXT(elm, field), field)) == NULL)\
            (head)->stqh_last = &STAILQ_NEXT((elm), field); \
    }                                \
} while (0)


#define    STAILQ_REMOVE_HEAD(head, field) do {                \
    if ((STAILQ_FIRST((head)) =                    \
         STAILQ_NEXT(STAILQ_FIRST((head)), field)) == NULL)        \
        (head)->stqh_last = &STAILQ_FIRST((head));        \
} while (0)

#define    STAILQ_REMOVE_HEAD_UNTIL(head, elm, field) do {            \
    if ((STAILQ_FIRST((head)) = STAILQ_NEXT((elm), field)) == NULL)    \
        (head)->stqh_last = &STAILQ_FIRST((head));        \
} while (0)

/*
 * List declarations.
 */
#define    ATH_LIST_HEAD(name, type)                    \
struct name {                                \
    struct type *lh_first;    /* first element */            \
}

#ifndef LIST_HEAD
#define LIST_HEAD ATH_LIST_HEAD
#endif

#define    LIST_HEAD_INITIALIZER(head)                    \
    { NULL }

#define    LIST_ENTRY(type)                        \
struct {                                \
    struct type *le_next;    /* next element */            \
    struct type **le_prev;    /* address of previous next element */    \
}

/*
 * List functions.
 */

#define    LIST_EMPTY(head)    ((head)->lh_first == NULL)

#define    LIST_FIRST(head)    ((head)->lh_first)

#define    LIST_FOREACH(var, head, field)                    \
    for ((var) = LIST_FIRST((head));                \
        (var);                            \
        (var) = LIST_NEXT((var), field))

#define    LIST_FOREACH_SAFE(var, head, field, tvar)            \
    for ((var) = LIST_FIRST((head));                \
        (var) && ((tvar) = LIST_NEXT((var), field), 1);        \
        (var) = (tvar))

#define    LIST_INIT(head) do {                        \
    LIST_FIRST((head)) = NULL;                    \
} while (0)

#define    LIST_INSERT_AFTER(listelm, elm, field) do {            \
    if ((LIST_NEXT((elm), field) = LIST_NEXT((listelm), field)) != NULL)\
        LIST_NEXT((listelm), field)->field.le_prev =        \
            &LIST_NEXT((elm), field);                \
    LIST_NEXT((listelm), field) = (elm);                \
    (elm)->field.le_prev = &LIST_NEXT((listelm), field);        \
} while (0)

#define    LIST_INSERT_BEFORE(listelm, elm, field) do {            \
    (elm)->field.le_prev = (listelm)->field.le_prev;        \
    LIST_NEXT((elm), field) = (listelm);                \
    *(listelm)->field.le_prev = (elm);                \
    (listelm)->field.le_prev = &LIST_NEXT((elm), field);        \
} while (0)

#define    LIST_INSERT_HEAD(head, elm, field) do {                \
    if ((LIST_NEXT((elm), field) = LIST_FIRST((head))) != NULL)    \
        LIST_FIRST((head))->field.le_prev = &LIST_NEXT((elm), field);\
    LIST_FIRST((head)) = (elm);                    \
    (elm)->field.le_prev = &LIST_FIRST((head));            \
} while (0)

#define    LIST_NEXT(elm, field)    ((elm)->field.le_next)

#define    LIST_REMOVE(elm, field) do {                    \
    if (LIST_NEXT((elm), field) != NULL)                \
        LIST_NEXT((elm), field)->field.le_prev =         \
            (elm)->field.le_prev;                \
    *(elm)->field.le_prev = LIST_NEXT((elm), field);        \
} while (0)

/*
 * Tail queue declarations.
 */
#define  HEADNAME
#define  COPY_HEADNAME(head)

#define    TAILQ_HEAD(name, type)                        \
struct name {                                \
    struct type *tqh_first;    /* first element */            \
    struct type **tqh_last;    /* addr of last next element */        \
    HEADNAME                            \
    TRACEBUF                            \
}

#define    TAILQ_HEAD_INITIALIZER(head)                    \
    { NULL, &(head).tqh_first }

#define    TAILQ_ENTRY(type)                        \
struct {                                \
    struct type *tqe_next;    /* next element */            \
    struct type **tqe_prev;    /* address of previous next element */    \
    TRACEBUF                            \
}

/*
 * Tail queue functions.
 */

#define    TAILQ_EMPTY(head)    ((head)->tqh_first == NULL)

#define    TAILQ_FIRST(head)    ((head)->tqh_first)

#define    TAILQ_FOREACH(var, head, field)                    \
    for ((var) = TAILQ_FIRST((head));                \
        (var);                            \
        (var) = TAILQ_NEXT((var), field))

#define    TAILQ_FOREACH_SAFE(var, head, field, tvar)            \
    for ((var) = TAILQ_FIRST((head));                \
        (var) && ((tvar) = TAILQ_NEXT((var), field), 1);        \
        (var) = (tvar))

#define    TAILQ_FOREACH_REVERSE(var, head, headname, field)        \
    for ((var) = TAILQ_LAST((head), headname);            \
        (var);                            \
        (var) = TAILQ_PREV((var), headname, field))

#define    TAILQ_FOREACH_REVERSE_SAFE(var, head, headname, field, tvar)    \
    for ((var) = TAILQ_LAST((head), headname);            \
        (var) && ((tvar) = TAILQ_PREV((var), headname, field), 1);    \
        (var) = (tvar))

#define    TAILQ_INIT(head) do {                        \
    TAILQ_FIRST((head)) = NULL;                    \
    (head)->tqh_last = &TAILQ_FIRST((head));            \
    COPY_HEADNAME(head);                         \
    QMD_TRACE_HEAD(head);                        \
} while (0)

#define    TAILQ_INSERT_AFTER(head, listelm, elm, field) do {        \
    if ((TAILQ_NEXT((elm), field) = TAILQ_NEXT((listelm), field)) != NULL)\
        TAILQ_NEXT((elm), field)->field.tqe_prev =         \
            &TAILQ_NEXT((elm), field);                \
    else {                                \
        (head)->tqh_last = &TAILQ_NEXT((elm), field);        \
        QMD_TRACE_HEAD(head);                    \
    }                                \
    TAILQ_NEXT((listelm), field) = (elm);                \
    (elm)->field.tqe_prev = &TAILQ_NEXT((listelm), field);        \
    QMD_TRACE_ELEM(&(elm)->field);                    \
    QMD_TRACE_ELEM(&listelm->field);                \
} while (0)

#define    TAILQ_INSERT_BEFORE(listelm, elm, field) do {            \
    (elm)->field.tqe_prev = (listelm)->field.tqe_prev;        \
    TAILQ_NEXT((elm), field) = (listelm);                \
    *(listelm)->field.tqe_prev = (elm);                \
    (listelm)->field.tqe_prev = &TAILQ_NEXT((elm), field);        \
    QMD_TRACE_ELEM(&(elm)->field);                    \
    QMD_TRACE_ELEM(&listelm->field);                \
} while (0)

#define    TAILQ_INSERT_HEAD(head, elm, field) do {            \
    if ((TAILQ_NEXT((elm), field) = TAILQ_FIRST((head))) != NULL)    \
        TAILQ_FIRST((head))->field.tqe_prev =            \
            &TAILQ_NEXT((elm), field);                \
    else                                \
        (head)->tqh_last = &TAILQ_NEXT((elm), field);        \
    TAILQ_FIRST((head)) = (elm);                    \
    (elm)->field.tqe_prev = &TAILQ_FIRST((head));            \
    QMD_TRACE_HEAD(head);                        \
    QMD_TRACE_ELEM(&(elm)->field);                    \
} while (0)

#define    TAILQ_INSERT_TAIL(head, elm, field) do {            \
    TAILQ_NEXT((elm), field) = NULL;                \
    (elm)->field.tqe_prev = (head)->tqh_last;            \
    *(head)->tqh_last = (elm);                    \
    (head)->tqh_last = &TAILQ_NEXT((elm), field);            \
    QMD_TRACE_HEAD(head);                        \
    QMD_TRACE_ELEM(&(elm)->field);                    \
} while (0)

#define    TAILQ_LAST(head, headname)                    \
    (*(((struct headname *)((head)->tqh_last))->tqh_last))

#define    TAILQ_NEXT(elm, field) ((elm)->field.tqe_next)

#define    TAILQ_PREV(elm, headname, field)                \
    (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last))

#define    TAILQ_REMOVE(head, elm, field) do {                \
    if ((TAILQ_NEXT((elm), field)) != NULL)                \
        TAILQ_NEXT((elm), field)->field.tqe_prev =         \
            (elm)->field.tqe_prev;                \
    else {                                \
        (head)->tqh_last = (elm)->field.tqe_prev;        \
        QMD_TRACE_HEAD(head);                    \
    }                                \
    *(elm)->field.tqe_prev = TAILQ_NEXT((elm), field);        \
    TRASHIT((elm)->field.tqe_next);                    \
    TRASHIT((elm)->field.tqe_prev);                    \
    QMD_TRACE_ELEM(&(elm)->field);                    \
} while (0)

#define TAILQ_CONCAT(head1, head2, field)  do {                  \
    if (!TAILQ_EMPTY(head2)) {                                   \
        *(head1)->tqh_last = (head2)->tqh_first;                 \
        (head2)->tqh_first->field.tqe_prev = (head1)->tqh_last;  \
        (head1)->tqh_last  = (head2)->tqh_last;                  \
        TAILQ_INIT((head2));                                     \
    }                                                            \
} while (0)

#ifdef _KERNEL

/*
 * XXX insque() and remque() are an old way of handling certain queues.
 * They bogusly assumes that all queue heads look alike.
 */

struct quehead {
    struct quehead *qh_link;
    struct quehead *qh_rlink;
};

#if defined(__GNUC__) || defined(__INTEL_COMPILER)

static __inline void
insque(void *a, void *b)
{
    struct quehead *element = (struct quehead *)a,
         *head = (struct quehead *)b;

    element->qh_link = head->qh_link;
    element->qh_rlink = head;
    head->qh_link = element;
    element->qh_link->qh_rlink = element;
}

static __inline void
remque(void *a)
{
    struct quehead *element = (struct quehead *)a;

    element->qh_link->qh_rlink = element->qh_rlink;
    element->qh_rlink->qh_link = element->qh_link;
    element->qh_rlink = 0;
}

#else /* !(__GNUC__ || __INTEL_COMPILER) */

void    insque(void *a, void *b);
void    remque(void *a);

#endif /* __GNUC__ || __INTEL_COMPILER */

#endif /* _KERNEL */

#endif /* !_SYS_QUEUE_H_ */
#else /* !__NetBSD__ */
#include_next <sys/queue.h>
#endif /* __NetBSD__ */
