184c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo
284c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo#ifndef _DBLLISTS_H
384c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo#define _DBLLISTS_H
484c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo
584c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo
684c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo
784c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo#define DBL_LIST_HEAD_INIT(name)        { &(name), &(name) }
884c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo
984c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo#define DBL_LIST_HEAD(name)             struct list_head name = DBL_LIST_HEAD_INIT(name)
1084c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo
1184c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo#define DBL_INIT_LIST_HEAD(ptr) \
1284c7ae74ed6ed24fa3849752e924aa11aae859eesonyajodo { \
1384c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo    (ptr)->pNext = (ptr)->pPrev = (ptr); \
1484c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo} while (0)
1584c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo
1684c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo#define DBL_LIST_ADD(newi, prev, next) \
1784c7ae74ed6ed24fa3849752e924aa11aae859eesonyajodo { \
1884c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo    struct list_head *pPrev = prev; \
1984c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo    struct list_head *pNext = next; \
2084c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo    (pNext)->pPrev = newi; \
2184c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo    (newi)->pNext = pNext; \
2284c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo    (newi)->pPrev = pPrev; \
2384c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo    (pPrev)->pNext = newi; \
2484c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo} while (0)
2584c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo
2684c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo#define DBL_LIST_ADDH(new, head)        DBL_LIST_ADD(new, head, (head)->pNext)
2784c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo
2884c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo#define DBL_LIST_ADDT(new, head)        DBL_LIST_ADD(new, (head)->pPrev, head)
2984c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo
3084c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo#define DBL_LIST_UNLINK(prev, next) \
3184c7ae74ed6ed24fa3849752e924aa11aae859eesonyajodo { \
3284c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo    struct list_head *pPrev = prev; \
3384c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo    struct list_head *pNext = next; \
3484c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo    (next)->pPrev = pPrev; \
3584c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo    (prev)->pNext = pNext; \
3684c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo} while (0)
3784c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo
3884c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo#define DBL_LIST_DEL(entry) \
3984c7ae74ed6ed24fa3849752e924aa11aae859eesonyajodo { \
4084c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo    DBL_LIST_UNLINK((entry)->pPrev, (entry)->pNext); \
4184c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo    DBL_INIT_LIST_HEAD(entry); \
4284c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo} while (0)
4384c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo
4484c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo#define DBL_LIST_EMTPY(head)            ((head)->pNext == head)
4584c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo
4684c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo#define DBL_LIST_SPLICE(list, head) \
4784c7ae74ed6ed24fa3849752e924aa11aae859eesonyajodo { \
4884c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo    struct list_head *    first = (list)->pNext; \
4984c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo    if (first != list) { \
5084c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo        struct list_head *	last = (list)->pPrev; \
5184c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo        struct list_head *	at = (head)->pNext; \
5284c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo        (first)->pPrev = head; \
5384c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo        (head)->pNext = first; \
5484c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo        (last)->pNext = at; \
5584c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo        (at)->pPrev = last; \
5684c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo    } \
5784c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo} while (0)
5884c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo
5984c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo#define DBL_HEAD_COPY(oldh, newh) \
6084c7ae74ed6ed24fa3849752e924aa11aae859eesonyajodo { \
6184c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo    *(oldh) = (*newh); \
6284c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo    (newh)->pNext->pPrev = (oldh); \
6384c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo    (newh)->pPrev->pNext = (oldh); \
6484c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo} while (0)
6584c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo
6684c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo#define DBL_ITEM_IN_LIST(ptr)           (((ptr)->pPrev != (ptr)) && ((ptr)->pNext != (ptr)))
6784c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo
6884c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo#define DBL_LIST_FIRST(head)            (((head)->pNext != (head)) ? (head)->pNext: NULL)
6984c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo
7084c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo#define DBL_LIST_LAST(head)             (((head)->pPrev != (head)) ? (head)->pPrev: NULL)
7184c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo
7284c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo#define DBL_LIST_ENTRY(ptr, type, member)   ((type *)((char *)(ptr) - (unsigned long)(&((type *)0)->member)))
7384c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo
7484c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo#define DBL_LIST_FOR_EACH(pos, head)    for (pos = (head)->pNext; pos != (head); pos = (pos)->pNext)
7584c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo
7684c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo#define DBL_END_OF_LIST(pos, head)      ((pos) == (head))
7784c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo
7884c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo#define DBL_LIST_NEXT(pos, head)        (((pos)->pNext != (head)) ? (pos)->pNext: NULL)
7984c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo
8084c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo#define DBL_LIST_PREV(pos, head)        (((pos)->pPrev != (head)) ? (pos)->pPrev: NULL)
8184c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo
8284c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo
8384c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo
8484c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo
8584c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo
8684c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo
8784c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo
8884c7ae74ed6ed24fa3849752e924aa11aae859eesonyajostruct list_head
8984c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo{
9084c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo    struct list_head *pNext;
9184c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo    struct list_head *pPrev;
9284c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo};
9384c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo
9484c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo
9584c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo
9684c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo
9784c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo
9884c7ae74ed6ed24fa3849752e924aa11aae859eesonyajo#endif
99