1 /*******************************************************************************
3 *Copyright (c) 2014 PMC-Sierra, Inc. All rights reserved.
5 *Redistribution and use in source and binary forms, with or without modification, are permitted provided
6 *that the following conditions are met:
7 *1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
9 *2. Redistributions in binary form must reproduce the above copyright notice,
10 *this list of conditions and the following disclaimer in the documentation and/or other materials provided
11 *with the distribution.
13 *THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED
14 *WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
15 *FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
16 *FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
17 *NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
18 *BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
19 *LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
20 *SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
24 ********************************************************************************/
29 typedef struct dmList_s dmList_t;
36 #define DMLIST_INIT_HDR(hdr) \
38 ((dmList_t *)(hdr))->flink = (dmList_t *)(hdr); \
39 ((dmList_t *)(hdr))->blink = (dmList_t *)(hdr); \
42 #define DMLIST_INIT_ELEMENT(hdr) \
44 ((dmList_t *)(hdr))->flink = (dmList_t *)agNULL; \
45 ((dmList_t *)(hdr))->blink = (dmList_t *)agNULL; \
48 #define DMLIST_ENQUEUE_AT_HEAD(toAddHdr,listHdr) \
50 ((dmList_t *)(toAddHdr))->flink = ((dmList_t *)(listHdr))->flink; \
51 ((dmList_t *)(toAddHdr))->blink = (dmList_t *)(listHdr) ; \
52 ((dmList_t *)(listHdr))->flink->blink = (dmList_t *)(toAddHdr); \
53 ((dmList_t *)(listHdr))->flink = (dmList_t *)(toAddHdr); \
56 #define DMLIST_ENQUEUE_AT_TAIL(toAddHdr,listHdr) \
58 ((dmList_t *)(toAddHdr))->flink = (dmList_t *)(listHdr); \
59 ((dmList_t *)(toAddHdr))->blink = ((dmList_t *)(listHdr))->blink; \
60 ((dmList_t *)(listHdr))->blink->flink = (dmList_t *)(toAddHdr); \
61 ((dmList_t *)(listHdr))->blink = (dmList_t *)(toAddHdr); \
64 #define DMLIST_EMPTY(listHdr) \
65 (((dmList_t *)(listHdr))->flink == ((dmList_t *)(listHdr)))
67 #define DMLIST_NOT_EMPTY(listHdr) \
68 (!DMLIST_EMPTY(listHdr))
70 #define DMLIST_DEQUEUE_THIS(hdr) \
72 ((dmList_t *)(hdr))->blink->flink = ((dmList_t *)(hdr))->flink; \
73 ((dmList_t *)(hdr))->flink->blink = ((dmList_t *)(hdr))->blink; \
74 ((dmList_t *)(hdr))->flink = ((dmList_t *)(hdr))->blink = agNULL; \
77 #define DMLIST_DEQUEUE_FROM_HEAD_FAST(atHeadHdr,listHdr) \
79 *((dmList_t **)(atHeadHdr)) = ((dmList_t *)(listHdr))->flink; \
80 (*((dmList_t **)(atHeadHdr)))->flink->blink = (dmList_t *)(listHdr); \
81 ((dmList_t *)(listHdr))->flink = (*(dmList_t **)(atHeadHdr))->flink; \
84 #define DMLIST_DEQUEUE_FROM_HEAD(atHeadHdr,listHdr) \
86 if (DMLIST_NOT_EMPTY((listHdr))) \
88 DMLIST_DEQUEUE_FROM_HEAD_FAST(atHeadHdr,listHdr); \
92 (*((dmList_t **)(atHeadHdr))) = (dmList_t *)agNULL; \
96 #define DMLIST_DEQUEUE_FROM_TAIL_FAST(atTailHdr,listHdr) \
98 (*((dmList_t **)(atTailHdr))) = ((dmList_t *)(listHdr))->blink; \
99 (*((dmList_t **)(atTailHdr)))->blink->flink = (dmList_t *)(listHdr); \
100 ((dmList_t *)(listHdr))->blink = (*((dmList_t **)(atTailHdr)))->blink; \
103 #define DMLIST_DEQUEUE_FROM_TAIL(atTailHdr,listHdr) \
105 if (DMLIST_NOT_EMPTY((listHdr))) \
107 DMLIST_DEQUEUE_FROM_TAIL_FAST(atTailHdr,listHdr); \
111 (*((dmList_t **)(atTailHdr))) = (dmList_t *)agNULL; \
115 #define DMLIST_ENQUEUE_LIST_AT_TAIL_FAST(toAddListHdr, listHdr) \
117 ((dmList_t *)toAddListHdr)->blink->flink = ((dmList_t *)listHdr); \
118 ((dmList_t *)toAddListHdr)->flink->blink = ((dmList_t *)listHdr)->blink; \
119 ((dmList_t *)listHdr)->blink->flink = ((dmList_t *)toAddListHdr)->flink; \
120 ((dmList_t *)listHdr)->blink = ((dmList_t *)toAddListHdr)->blink; \
121 DMLIST_INIT_HDR(toAddListHdr); \
124 #define DMLIST_ENQUEUE_LIST_AT_TAIL(toAddListHdr, listHdr) \
126 if (DMLIST_NOT_EMPTY(toAddListHdr)) \
128 DMLIST_ENQUEUE_LIST_AT_TAIL_FAST(toAddListHdr, listHdr); \
132 #define DMLIST_ENQUEUE_LIST_AT_HEAD_FAST(toAddListHdr, listHdr) \
134 ((dmList_t *)toAddListHdr)->blink->flink = ((dmList_t *)listHdr)->flink; \
135 ((dmList_t *)toAddListHdr)->flink->blink = ((dmList_t *)listHdr); \
136 ((dmList_t *)listHdr)->flink->blink = ((dmList_t *)toAddListHdr)->blink; \
137 ((dmList_t *)listHdr)->flink = ((dmList_t *)toAddListHdr)->flink; \
138 DMLIST_INIT_HDR(toAddListHdr); \
141 #define DMLIST_ENQUEUE_LIST_AT_HEAD(toAddListHdr, listHdr) \
143 if (DMLIST_NOT_EMPTY(toAddListHdr)) \
145 DMLIST_ENQUEUE_LIST_AT_HEAD_FAST(toAddListHdr, listHdr); \
149 #define TD_FIELD_OFFSET(baseType,fieldName) \
150 ((bit32)((bitptr)(&(((baseType *)0)->fieldName))))
152 #define DMLIST_OBJECT_BASE(baseType,fieldName,fieldPtr) \
153 (void *)fieldPtr == (void *)0 ? (baseType *)0 : \
154 ((baseType *)((bit8 *)(fieldPtr) - ((bitptr)(&(((baseType *)0)->fieldName)))))
159 #endif /* __DMLIST_H__ */