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