dmlist.h revision 285809
1/*******************************************************************************
2**
3*Copyright (c) 2014 PMC-Sierra, Inc.  All rights reserved.
4*
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
8*following disclaimer.
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.
12*
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
21*
22* $FreeBSD$
23*
24********************************************************************************/
25
26#ifndef __DMLIST_H__
27#define __DMLIST_H__
28
29typedef struct dmList_s dmList_t;
30
31struct dmList_s {
32  dmList_t  *flink;
33  dmList_t  *blink;
34};
35
36#define DMLIST_INIT_HDR(hdr)                        \
37  do {                                              \
38    ((dmList_t *)(hdr))->flink = (dmList_t *)(hdr); \
39    ((dmList_t *)(hdr))->blink = (dmList_t *)(hdr); \
40  } while (0)
41
42#define DMLIST_INIT_ELEMENT(hdr)                     \
43  do {                                               \
44    ((dmList_t *)(hdr))->flink = (dmList_t *)agNULL; \
45    ((dmList_t *)(hdr))->blink = (dmList_t *)agNULL; \
46  } while (0)
47
48#define DMLIST_ENQUEUE_AT_HEAD(toAddHdr,listHdr)                                \
49  do {                                                                          \
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);         \
54  } while (0)
55
56#define DMLIST_ENQUEUE_AT_TAIL(toAddHdr,listHdr)                                \
57  do {                                                                          \
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);         \
62  } while (0)
63
64#define DMLIST_EMPTY(listHdr) \
65  (((dmList_t *)(listHdr))->flink == ((dmList_t *)(listHdr)))
66
67#define DMLIST_NOT_EMPTY(listHdr) \
68  (!DMLIST_EMPTY(listHdr))
69
70#define DMLIST_DEQUEUE_THIS(hdr)                                      \
71  do {                                                                \
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; \
75  } while (0)
76
77#define DMLIST_DEQUEUE_FROM_HEAD_FAST(atHeadHdr,listHdr)                              \
78  do {                                                                                \
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; \
82  } while (0)
83
84#define DMLIST_DEQUEUE_FROM_HEAD(atHeadHdr,listHdr)             \
85do {                                                            \
86  if (DMLIST_NOT_EMPTY((listHdr)))                              \
87  {                                                             \
88    DMLIST_DEQUEUE_FROM_HEAD_FAST(atHeadHdr,listHdr);           \
89  }                                                             \
90  else                                                          \
91  {                                                             \
92    (*((dmList_t **)(atHeadHdr))) = (dmList_t *)agNULL;         \
93  }                                                             \
94} while (0)
95
96#define DMLIST_DEQUEUE_FROM_TAIL_FAST(atTailHdr,listHdr)                                \
97  do {                                                                                  \
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; \
101  } while (0)
102
103#define DMLIST_DEQUEUE_FROM_TAIL(atTailHdr,listHdr)               \
104  do {                                                            \
105    if (DMLIST_NOT_EMPTY((listHdr)))                              \
106    {                                                             \
107      DMLIST_DEQUEUE_FROM_TAIL_FAST(atTailHdr,listHdr);           \
108    }                                                             \
109    else                                                          \
110    {                                                             \
111      (*((dmList_t **)(atTailHdr))) = (dmList_t *)agNULL;         \
112    }                                                             \
113  } while (0)
114
115#define DMLIST_ENQUEUE_LIST_AT_TAIL_FAST(toAddListHdr, listHdr)               \
116  do {                                                                        \
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);                                            \
122  } while (0)
123
124#define DMLIST_ENQUEUE_LIST_AT_TAIL(toAddListHdr, listHdr)                    \
125  do {                                                                        \
126    if (DMLIST_NOT_EMPTY(toAddListHdr))                                       \
127    {                                                                         \
128      DMLIST_ENQUEUE_LIST_AT_TAIL_FAST(toAddListHdr, listHdr);                \
129    }                                                                         \
130  } while (0)
131
132#define DMLIST_ENQUEUE_LIST_AT_HEAD_FAST(toAddListHdr, listHdr)               \
133  do {                                                                        \
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);                                            \
139  } while (0)
140
141#define DMLIST_ENQUEUE_LIST_AT_HEAD(toAddListHdr, listHdr)                    \
142  do {                                                                        \
143    if (DMLIST_NOT_EMPTY(toAddListHdr))                                       \
144    {                                                                         \
145      DMLIST_ENQUEUE_LIST_AT_HEAD_FAST(toAddListHdr, listHdr);                \
146    }                                                                         \
147  } while (0)
148
149#define TD_FIELD_OFFSET(baseType,fieldName) \
150                    ((bit32)((bitptr)(&(((baseType *)0)->fieldName))))
151
152#define DMLIST_OBJECT_BASE(baseType,fieldName,fieldPtr)         \
153                    (void *)fieldPtr == (void *)0 ? (baseType *)0 :             \
154                    ((baseType *)((bit8 *)(fieldPtr) - ((bitptr)(&(((baseType *)0)->fieldName)))))
155
156
157
158
159#endif /* __DMLIST_H__ */
160
161
162