32 #define QMD_SAVELINK(name, link)
38 #define SLIST_HEAD(name, type) \
40 struct type *slh_first; \
43 #define SLIST_HEAD_INITIALIZER(head) \
46 #define SLIST_ENTRY(type) \
48 struct type *sle_next; \
54 #define SLIST_EMPTY(head) ((head)->slh_first == NULL)
56 #define SLIST_FIRST(head) ((head)->slh_first)
58 #define SLIST_FOREACH(var, head, field) \
59 for ((var) = SLIST_FIRST((head)); \
61 (var) = SLIST_NEXT((var), field))
63 #define SLIST_FOREACH_SAFE(var, head, field, tvar) \
64 for ((var) = SLIST_FIRST((head)); \
65 (var) && ((tvar) = SLIST_NEXT((var), field), 1); \
68 #define SLIST_FOREACH_PREVPTR(var, varp, head, field) \
69 for ((varp) = &SLIST_FIRST((head)); \
70 ((var) = *(varp)) != NULL; \
71 (varp) = &SLIST_NEXT((var), field))
73 #define SLIST_INIT(head) do { \
74 SLIST_FIRST((head)) = NULL; \
77 #define SLIST_INSERT_AFTER(slistelm, elm, field) do { \
78 SLIST_NEXT((elm), field) = SLIST_NEXT((slistelm), field); \
79 SLIST_NEXT((slistelm), field) = (elm); \
82 #define SLIST_INSERT_HEAD(head, elm, field) do { \
83 SLIST_NEXT((elm), field) = SLIST_FIRST((head)); \
84 SLIST_FIRST((head)) = (elm); \
87 #define SLIST_NEXT(elm, field) ((elm)->field.sle_next)
89 #define SLIST_REMOVE(head, elm, type, field) do { \
90 QMD_SAVELINK(oldnext, (elm)->field.sle_next); \
91 if (SLIST_FIRST((head)) == (elm)) { \
92 SLIST_REMOVE_HEAD((head), field); \
95 struct type *curelm = SLIST_FIRST((head)); \
96 while (SLIST_NEXT(curelm, field) != (elm)) \
97 curelm = SLIST_NEXT(curelm, field); \
98 SLIST_REMOVE_AFTER(curelm, field); \
103 #define SLIST_REMOVE_AFTER(elm, field) do { \
104 SLIST_NEXT(elm, field) = \
105 SLIST_NEXT(SLIST_NEXT(elm, field), field); \
108 #define SLIST_REMOVE_HEAD(head, field) do { \
109 SLIST_FIRST((head)) = SLIST_NEXT(SLIST_FIRST((head)), field); \
115 #define STAILQ_HEAD(name, type) \
117 struct type *stqh_first; \
118 struct type **stqh_last; \
121 #define STAILQ_HEAD_INITIALIZER(head) \
122 { NULL, &(head).stqh_first }
124 #define STAILQ_ENTRY(type) \
126 struct type *stqe_next; \
132 #define STAILQ_CONCAT(head1, head2) do { \
133 if (!STAILQ_EMPTY((head2))) { \
134 *(head1)->stqh_last = (head2)->stqh_first; \
135 (head1)->stqh_last = (head2)->stqh_last; \
136 STAILQ_INIT((head2)); \
140 #define STAILQ_EMPTY(head) ((head)->stqh_first == NULL)
142 #define STAILQ_FIRST(head) ((head)->stqh_first)
144 #define STAILQ_FOREACH(var, head, field) \
145 for((var) = STAILQ_FIRST((head)); \
147 (var) = STAILQ_NEXT((var), field))
150 #define STAILQ_FOREACH_SAFE(var, head, field, tvar) \
151 for ((var) = STAILQ_FIRST((head)); \
152 (var) && ((tvar) = STAILQ_NEXT((var), field), 1); \
155 #define STAILQ_INIT(head) do { \
156 STAILQ_FIRST((head)) = NULL; \
157 (head)->stqh_last = &STAILQ_FIRST((head)); \
160 #define STAILQ_INSERT_AFTER(head, tqelm, elm, field) do { \
161 if ((STAILQ_NEXT((elm), field) = STAILQ_NEXT((tqelm), field)) == NULL)\
162 (head)->stqh_last = &STAILQ_NEXT((elm), field); \
163 STAILQ_NEXT((tqelm), field) = (elm); \
166 #define STAILQ_INSERT_HEAD(head, elm, field) do { \
167 if ((STAILQ_NEXT((elm), field) = STAILQ_FIRST((head))) == NULL) \
168 (head)->stqh_last = &STAILQ_NEXT((elm), field); \
169 STAILQ_FIRST((head)) = (elm); \
172 #define STAILQ_INSERT_TAIL(head, elm, field) do { \
173 STAILQ_NEXT((elm), field) = NULL; \
174 *(head)->stqh_last = (elm); \
175 (head)->stqh_last = &STAILQ_NEXT((elm), field); \
178 #define STAILQ_LAST(head, type, field) \
179 (STAILQ_EMPTY((head))? \
181 ((struct type *)(void *)\
182 ((char *)((head)->stqh_last) - __offsetof(struct type, field))))
184 #define STAILQ_NEXT(elm, field) ((elm)->field.stqe_next)
186 #define STAILQ_REMOVE(head, elm, type, field) do { \
187 QMD_SAVELINK(oldnext, (elm)->field.stqe_next); \
188 if (STAILQ_FIRST((head)) == (elm)) { \
189 STAILQ_REMOVE_HEAD((head), field); \
192 struct type *curelm = STAILQ_FIRST((head)); \
193 while (STAILQ_NEXT(curelm, field) != (elm)) \
194 curelm = STAILQ_NEXT(curelm, field); \
195 STAILQ_REMOVE_AFTER(head, curelm, field); \
200 #define STAILQ_REMOVE_HEAD(head, field) do { \
201 if ((STAILQ_FIRST((head)) = \
202 STAILQ_NEXT(STAILQ_FIRST((head)), field)) == NULL) \
203 (head)->stqh_last = &STAILQ_FIRST((head)); \
206 #define STAILQ_REMOVE_AFTER(head, elm, field) do { \
207 if ((STAILQ_NEXT(elm, field) = \
208 STAILQ_NEXT(STAILQ_NEXT(elm, field), field)) == NULL) \
209 (head)->stqh_last = &STAILQ_NEXT((elm), field); \
212 #define STAILQ_SWAP(head1, head2, type) do { \
213 struct type *swap_first = STAILQ_FIRST(head1); \
214 struct type **swap_last = (head1)->stqh_last; \
215 STAILQ_FIRST(head1) = STAILQ_FIRST(head2); \
216 (head1)->stqh_last = (head2)->stqh_last; \
217 STAILQ_FIRST(head2) = swap_first; \
218 (head2)->stqh_last = swap_last; \
219 if (STAILQ_EMPTY(head1)) \
220 (head1)->stqh_last = &STAILQ_FIRST(head1); \
221 if (STAILQ_EMPTY(head2)) \
222 (head2)->stqh_last = &STAILQ_FIRST(head2); \
225 #define STAILQ_INSERT_CHAIN_HEAD(head, elm_chead, elm_ctail, field) do { \
226 if ((STAILQ_NEXT(elm_ctail, field) = STAILQ_FIRST(head)) == NULL ) { \
227 (head)->stqh_last = &STAILQ_NEXT(elm_ctail, field); \
229 STAILQ_FIRST(head) = (elm_chead); \