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