smlist.h revision 285809
1/*******************************************************************************
2*Copyright (c) 2014 PMC-Sierra, Inc.  All rights reserved.
3*
4*Redistribution and use in source and binary forms, with or without modification, are permitted provided
5*that the following conditions are met:
6*1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
7*following disclaimer.
8*2. Redistributions in binary form must reproduce the above copyright notice,
9*this list of conditions and the following disclaimer in the documentation and/or other materials provided
10*with the distribution.
11*
12*THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED
13*WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
14*FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
15*FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
16*NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
17*BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
18*LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
19*SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
20*
21* $FreeBSD$
22*
23********************************************************************************/
24
25#ifndef __SMLIST_H__
26#define __SMLIST_H__
27
28typedef struct smList_s smList_t;
29
30struct smList_s {
31  smList_t  *flink;
32  smList_t  *blink;
33};
34
35#define SMLIST_INIT_HDR(hdr)                        \
36  do {                                              \
37    ((smList_t *)(hdr))->flink = (smList_t *)(hdr); \
38    ((smList_t *)(hdr))->blink = (smList_t *)(hdr); \
39  } while (0)
40
41#define SMLIST_INIT_ELEMENT(hdr)                     \
42  do {                                               \
43    ((smList_t *)(hdr))->flink = (smList_t *)agNULL; \
44    ((smList_t *)(hdr))->blink = (smList_t *)agNULL; \
45  } while (0)
46
47#define SMLIST_ENQUEUE_AT_HEAD(toAddHdr,listHdr)                                \
48  do {                                                                          \
49    ((smList_t *)(toAddHdr))->flink           = ((smList_t *)(listHdr))->flink; \
50    ((smList_t *)(toAddHdr))->blink           = (smList_t *)(listHdr) ;         \
51    ((smList_t *)(listHdr))->flink->blink     = (smList_t *)(toAddHdr);         \
52    ((smList_t *)(listHdr))->flink            = (smList_t *)(toAddHdr);         \
53  } while (0)
54
55#define SMLIST_ENQUEUE_AT_TAIL(toAddHdr,listHdr)                                \
56  do {                                                                          \
57    ((smList_t *)(toAddHdr))->flink           = (smList_t *)(listHdr);          \
58    ((smList_t *)(toAddHdr))->blink           = ((smList_t *)(listHdr))->blink; \
59    ((smList_t *)(listHdr))->blink->flink     = (smList_t *)(toAddHdr);         \
60    ((smList_t *)(listHdr))->blink            = (smList_t *)(toAddHdr);         \
61  } while (0)
62
63#define SMLIST_EMPTY(listHdr) \
64  (((smList_t *)(listHdr))->flink == ((smList_t *)(listHdr)))
65
66#define SMLIST_NOT_EMPTY(listHdr) \
67  (!SMLIST_EMPTY(listHdr))
68
69#define SMLIST_DEQUEUE_THIS(hdr)                                      \
70  do {                                                                \
71    ((smList_t *)(hdr))->blink->flink = ((smList_t *)(hdr))->flink;   \
72    ((smList_t *)(hdr))->flink->blink = ((smList_t *)(hdr))->blink;   \
73    ((smList_t *)(hdr))->flink = ((smList_t *)(hdr))->blink = agNULL; \
74  } while (0)
75
76#define SMLIST_DEQUEUE_FROM_HEAD_FAST(atHeadHdr,listHdr)                              \
77  do {                                                                                \
78    *((smList_t **)(atHeadHdr))                 = ((smList_t *)(listHdr))->flink;     \
79    (*((smList_t **)(atHeadHdr)))->flink->blink = (smList_t *)(listHdr);              \
80    ((smList_t *)(listHdr))->flink              = (*(smList_t **)(atHeadHdr))->flink; \
81  } while (0)
82
83#define SMLIST_DEQUEUE_FROM_HEAD(atHeadHdr,listHdr)             \
84do {                                                            \
85  if (SMLIST_NOT_EMPTY((listHdr)))                              \
86  {                                                             \
87    SMLIST_DEQUEUE_FROM_HEAD_FAST(atHeadHdr,listHdr);           \
88  }                                                             \
89  else                                                          \
90  {                                                             \
91    (*((smList_t **)(atHeadHdr))) = (smList_t *)agNULL;         \
92  }                                                             \
93} while (0)
94
95#define SMLIST_DEQUEUE_FROM_TAIL_FAST(atTailHdr,listHdr)                                \
96  do {                                                                                  \
97    (*((smList_t **)(atTailHdr)))               = ((smList_t *)(listHdr))->blink;       \
98    (*((smList_t **)(atTailHdr)))->blink->flink = (smList_t *)(listHdr);                \
99    ((smList_t *)(listHdr))->blink              = (*((smList_t **)(atTailHdr)))->blink; \
100  } while (0)
101
102#define SMLIST_DEQUEUE_FROM_TAIL(atTailHdr,listHdr)               \
103  do {                                                            \
104    if (SMLIST_NOT_EMPTY((listHdr)))                              \
105    {                                                             \
106      SMLIST_DEQUEUE_FROM_TAIL_FAST(atTailHdr,listHdr);           \
107    }                                                             \
108    else                                                          \
109    {                                                             \
110      (*((smList_t **)(atTailHdr))) = (smList_t *)agNULL;         \
111    }                                                             \
112  } while (0)
113
114#define SMLIST_ENQUEUE_LIST_AT_TAIL_FAST(toAddListHdr, listHdr)               \
115  do {                                                                        \
116    ((smList_t *)toAddListHdr)->blink->flink = ((smList_t *)listHdr);         \
117    ((smList_t *)toAddListHdr)->flink->blink = ((smList_t *)listHdr)->blink;  \
118    ((smList_t *)listHdr)->blink->flink = ((smList_t *)toAddListHdr)->flink;  \
119    ((smList_t *)listHdr)->blink = ((smList_t *)toAddListHdr)->blink;         \
120    SMLIST_INIT_HDR(toAddListHdr);                                            \
121  } while (0)
122
123#define SMLIST_ENQUEUE_LIST_AT_TAIL(toAddListHdr, listHdr)                    \
124  do {                                                                        \
125    if (SMLIST_NOT_EMPTY(toAddListHdr))                                       \
126    {                                                                         \
127      SMLIST_ENQUEUE_LIST_AT_TAIL_FAST(toAddListHdr, listHdr);                \
128    }                                                                         \
129  } while (0)
130
131#define SMLIST_ENQUEUE_LIST_AT_HEAD_FAST(toAddListHdr, listHdr)               \
132  do {                                                                        \
133    ((smList_t *)toAddListHdr)->blink->flink = ((smList_t *)listHdr)->flink;  \
134    ((smList_t *)toAddListHdr)->flink->blink = ((smList_t *)listHdr);         \
135    ((smList_t *)listHdr)->flink->blink = ((smList_t *)toAddListHdr)->blink;  \
136    ((smList_t *)listHdr)->flink = ((smList_t *)toAddListHdr)->flink;         \
137    SMLIST_INIT_HDR(toAddListHdr);                                            \
138  } while (0)
139
140#define SMLIST_ENQUEUE_LIST_AT_HEAD(toAddListHdr, listHdr)                    \
141  do {                                                                        \
142    if (SMLIST_NOT_EMPTY(toAddListHdr))                                       \
143    {                                                                         \
144      SMLIST_ENQUEUE_LIST_AT_HEAD_FAST(toAddListHdr, listHdr);                \
145    }                                                                         \
146  } while (0)
147
148#define TD_FIELD_OFFSET(baseType,fieldName) \
149                    ((bit32)((bitptr)(&(((baseType *)0)->fieldName))))
150
151#define SMLIST_OBJECT_BASE(baseType,fieldName,fieldPtr)         \
152                    (void *)fieldPtr == (void *)0 ? (baseType *)0 :             \
153                    ((baseType *)((bit8 *)(fieldPtr) - ((bitptr)(&(((baseType *)0)->fieldName)))))
154
155
156
157
158#endif /* __SMLIST_H__ */
159
160
161
162