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