FreeBSD kernel pms device code
smlist.h
Go to the documentation of this file.
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 {
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
smList_t * flink
Definition: smlist.h:31
smList_t * blink
Definition: smlist.h:32