1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40#ifndef QEMU_SYS_QUEUE_H_
41#define QEMU_SYS_QUEUE_H_
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81#include "qemu/atomic.h"
82
83
84
85
86#define QLIST_HEAD(name, type) \
87struct name { \
88 struct type *lh_first; \
89}
90
91#define QLIST_HEAD_INITIALIZER(head) \
92 { NULL }
93
94#define QLIST_ENTRY(type) \
95struct { \
96 struct type *le_next; \
97 struct type **le_prev; \
98}
99
100
101
102
103#define QLIST_INIT(head) do { \
104 (head)->lh_first = NULL; \
105} while (0)
106
107#define QLIST_SWAP(dstlist, srclist, field) do { \
108 void *tmplist; \
109 tmplist = (srclist)->lh_first; \
110 (srclist)->lh_first = (dstlist)->lh_first; \
111 if ((srclist)->lh_first != NULL) { \
112 (srclist)->lh_first->field.le_prev = &(srclist)->lh_first; \
113 } \
114 (dstlist)->lh_first = tmplist; \
115 if ((dstlist)->lh_first != NULL) { \
116 (dstlist)->lh_first->field.le_prev = &(dstlist)->lh_first; \
117 } \
118} while (0)
119
120#define QLIST_FIX_HEAD_PTR(head, field) do { \
121 if ((head)->lh_first != NULL) { \
122 (head)->lh_first->field.le_prev = &(head)->lh_first; \
123 } \
124} while (0)
125
126#define QLIST_INSERT_AFTER(listelm, elm, field) do { \
127 if (((elm)->field.le_next = (listelm)->field.le_next) != NULL) \
128 (listelm)->field.le_next->field.le_prev = \
129 &(elm)->field.le_next; \
130 (listelm)->field.le_next = (elm); \
131 (elm)->field.le_prev = &(listelm)->field.le_next; \
132} while (0)
133
134#define QLIST_INSERT_BEFORE(listelm, elm, field) do { \
135 (elm)->field.le_prev = (listelm)->field.le_prev; \
136 (elm)->field.le_next = (listelm); \
137 *(listelm)->field.le_prev = (elm); \
138 (listelm)->field.le_prev = &(elm)->field.le_next; \
139} while (0)
140
141#define QLIST_INSERT_HEAD(head, elm, field) do { \
142 if (((elm)->field.le_next = (head)->lh_first) != NULL) \
143 (head)->lh_first->field.le_prev = &(elm)->field.le_next;\
144 (head)->lh_first = (elm); \
145 (elm)->field.le_prev = &(head)->lh_first; \
146} while (0)
147
148#define QLIST_REMOVE(elm, field) do { \
149 if ((elm)->field.le_next != NULL) \
150 (elm)->field.le_next->field.le_prev = \
151 (elm)->field.le_prev; \
152 *(elm)->field.le_prev = (elm)->field.le_next; \
153} while (0)
154
155#define QLIST_FOREACH(var, head, field) \
156 for ((var) = ((head)->lh_first); \
157 (var); \
158 (var) = ((var)->field.le_next))
159
160#define QLIST_FOREACH_SAFE(var, head, field, next_var) \
161 for ((var) = ((head)->lh_first); \
162 (var) && ((next_var) = ((var)->field.le_next), 1); \
163 (var) = (next_var))
164
165
166
167
168#define QLIST_EMPTY(head) ((head)->lh_first == NULL)
169#define QLIST_FIRST(head) ((head)->lh_first)
170#define QLIST_NEXT(elm, field) ((elm)->field.le_next)
171
172
173
174
175
176#define QSLIST_HEAD(name, type) \
177struct name { \
178 struct type *slh_first; \
179}
180
181#define QSLIST_HEAD_INITIALIZER(head) \
182 { NULL }
183
184#define QSLIST_ENTRY(type) \
185struct { \
186 struct type *sle_next; \
187}
188
189
190
191
192#define QSLIST_INIT(head) do { \
193 (head)->slh_first = NULL; \
194} while (0)
195
196#define QSLIST_INSERT_AFTER(slistelm, elm, field) do { \
197 (elm)->field.sle_next = (slistelm)->field.sle_next; \
198 (slistelm)->field.sle_next = (elm); \
199} while (0)
200
201#define QSLIST_INSERT_HEAD(head, elm, field) do { \
202 (elm)->field.sle_next = (head)->slh_first; \
203 (head)->slh_first = (elm); \
204} while (0)
205
206#define QSLIST_INSERT_HEAD_ATOMIC(head, elm, field) do { \
207 typeof(elm) save_sle_next; \
208 do { \
209 save_sle_next = (elm)->field.sle_next = (head)->slh_first; \
210 } while (atomic_cmpxchg(&(head)->slh_first, save_sle_next, (elm)) != \
211 save_sle_next); \
212} while (0)
213
214#define QSLIST_MOVE_ATOMIC(dest, src) do { \
215 (dest)->slh_first = atomic_xchg(&(src)->slh_first, NULL); \
216} while (0)
217
218#define QSLIST_REMOVE_HEAD(head, field) do { \
219 (head)->slh_first = (head)->slh_first->field.sle_next; \
220} while (0)
221
222#define QSLIST_REMOVE_AFTER(slistelm, field) do { \
223 (slistelm)->field.sle_next = \
224 QSLIST_NEXT(QSLIST_NEXT((slistelm), field), field); \
225} while (0)
226
227#define QSLIST_FOREACH(var, head, field) \
228 for((var) = (head)->slh_first; (var); (var) = (var)->field.sle_next)
229
230#define QSLIST_FOREACH_SAFE(var, head, field, tvar) \
231 for ((var) = QSLIST_FIRST((head)); \
232 (var) && ((tvar) = QSLIST_NEXT((var), field), 1); \
233 (var) = (tvar))
234
235
236
237
238#define QSLIST_EMPTY(head) ((head)->slh_first == NULL)
239#define QSLIST_FIRST(head) ((head)->slh_first)
240#define QSLIST_NEXT(elm, field) ((elm)->field.sle_next)
241
242
243
244
245
246#define QSIMPLEQ_HEAD(name, type) \
247struct name { \
248 struct type *sqh_first; \
249 struct type **sqh_last; \
250}
251
252#define QSIMPLEQ_HEAD_INITIALIZER(head) \
253 { NULL, &(head).sqh_first }
254
255#define QSIMPLEQ_ENTRY(type) \
256struct { \
257 struct type *sqe_next; \
258}
259
260
261
262
263#define QSIMPLEQ_INIT(head) do { \
264 (head)->sqh_first = NULL; \
265 (head)->sqh_last = &(head)->sqh_first; \
266} while (0)
267
268#define QSIMPLEQ_INSERT_HEAD(head, elm, field) do { \
269 if (((elm)->field.sqe_next = (head)->sqh_first) == NULL) \
270 (head)->sqh_last = &(elm)->field.sqe_next; \
271 (head)->sqh_first = (elm); \
272} while (0)
273
274#define QSIMPLEQ_INSERT_TAIL(head, elm, field) do { \
275 (elm)->field.sqe_next = NULL; \
276 *(head)->sqh_last = (elm); \
277 (head)->sqh_last = &(elm)->field.sqe_next; \
278} while (0)
279
280#define QSIMPLEQ_INSERT_AFTER(head, listelm, elm, field) do { \
281 if (((elm)->field.sqe_next = (listelm)->field.sqe_next) == NULL) \
282 (head)->sqh_last = &(elm)->field.sqe_next; \
283 (listelm)->field.sqe_next = (elm); \
284} while (0)
285
286#define QSIMPLEQ_REMOVE_HEAD(head, field) do { \
287 if (((head)->sqh_first = (head)->sqh_first->field.sqe_next) == NULL)\
288 (head)->sqh_last = &(head)->sqh_first; \
289} while (0)
290
291#define QSIMPLEQ_SPLIT_AFTER(head, elm, field, removed) do { \
292 QSIMPLEQ_INIT(removed); \
293 if (((removed)->sqh_first = (head)->sqh_first) != NULL) { \
294 if (((head)->sqh_first = (elm)->field.sqe_next) == NULL) { \
295 (head)->sqh_last = &(head)->sqh_first; \
296 } \
297 (removed)->sqh_last = &(elm)->field.sqe_next; \
298 (elm)->field.sqe_next = NULL; \
299 } \
300} while (0)
301
302#define QSIMPLEQ_REMOVE(head, elm, type, field) do { \
303 if ((head)->sqh_first == (elm)) { \
304 QSIMPLEQ_REMOVE_HEAD((head), field); \
305 } else { \
306 struct type *curelm = (head)->sqh_first; \
307 while (curelm->field.sqe_next != (elm)) \
308 curelm = curelm->field.sqe_next; \
309 if ((curelm->field.sqe_next = \
310 curelm->field.sqe_next->field.sqe_next) == NULL) \
311 (head)->sqh_last = &(curelm)->field.sqe_next; \
312 } \
313} while (0)
314
315#define QSIMPLEQ_FOREACH(var, head, field) \
316 for ((var) = ((head)->sqh_first); \
317 (var); \
318 (var) = ((var)->field.sqe_next))
319
320#define QSIMPLEQ_FOREACH_SAFE(var, head, field, next) \
321 for ((var) = ((head)->sqh_first); \
322 (var) && ((next = ((var)->field.sqe_next)), 1); \
323 (var) = (next))
324
325#define QSIMPLEQ_CONCAT(head1, head2) do { \
326 if (!QSIMPLEQ_EMPTY((head2))) { \
327 *(head1)->sqh_last = (head2)->sqh_first; \
328 (head1)->sqh_last = (head2)->sqh_last; \
329 QSIMPLEQ_INIT((head2)); \
330 } \
331} while (0)
332
333#define QSIMPLEQ_LAST(head, type, field) \
334 (QSIMPLEQ_EMPTY((head)) ? \
335 NULL : \
336 ((struct type *)(void *) \
337 ((char *)((head)->sqh_last) - offsetof(struct type, field))))
338
339
340
341
342#define QSIMPLEQ_EMPTY(head) ((head)->sqh_first == NULL)
343#define QSIMPLEQ_FIRST(head) ((head)->sqh_first)
344#define QSIMPLEQ_NEXT(elm, field) ((elm)->field.sqe_next)
345
346
347
348
349
350#define Q_TAILQ_HEAD(name, type, qual) \
351struct name { \
352 qual type *tqh_first; \
353 qual type *qual *tqh_last; \
354}
355#define QTAILQ_HEAD(name, type) Q_TAILQ_HEAD(name, struct type,)
356
357#define QTAILQ_HEAD_INITIALIZER(head) \
358 { NULL, &(head).tqh_first }
359
360#define Q_TAILQ_ENTRY(type, qual) \
361struct { \
362 qual type *tqe_next; \
363 qual type *qual *tqe_prev; \
364}
365#define QTAILQ_ENTRY(type) Q_TAILQ_ENTRY(struct type,)
366
367
368
369
370#define QTAILQ_INIT(head) do { \
371 (head)->tqh_first = NULL; \
372 (head)->tqh_last = &(head)->tqh_first; \
373} while (0)
374
375#define QTAILQ_INSERT_HEAD(head, elm, field) do { \
376 if (((elm)->field.tqe_next = (head)->tqh_first) != NULL) \
377 (head)->tqh_first->field.tqe_prev = \
378 &(elm)->field.tqe_next; \
379 else \
380 (head)->tqh_last = &(elm)->field.tqe_next; \
381 (head)->tqh_first = (elm); \
382 (elm)->field.tqe_prev = &(head)->tqh_first; \
383} while (0)
384
385#define QTAILQ_INSERT_TAIL(head, elm, field) do { \
386 (elm)->field.tqe_next = NULL; \
387 (elm)->field.tqe_prev = (head)->tqh_last; \
388 *(head)->tqh_last = (elm); \
389 (head)->tqh_last = &(elm)->field.tqe_next; \
390} while (0)
391
392#define QTAILQ_INSERT_AFTER(head, listelm, elm, field) do { \
393 if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != NULL)\
394 (elm)->field.tqe_next->field.tqe_prev = \
395 &(elm)->field.tqe_next; \
396 else \
397 (head)->tqh_last = &(elm)->field.tqe_next; \
398 (listelm)->field.tqe_next = (elm); \
399 (elm)->field.tqe_prev = &(listelm)->field.tqe_next; \
400} while (0)
401
402#define QTAILQ_INSERT_BEFORE(listelm, elm, field) do { \
403 (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \
404 (elm)->field.tqe_next = (listelm); \
405 *(listelm)->field.tqe_prev = (elm); \
406 (listelm)->field.tqe_prev = &(elm)->field.tqe_next; \
407} while (0)
408
409#define QTAILQ_REMOVE(head, elm, field) do { \
410 if (((elm)->field.tqe_next) != NULL) \
411 (elm)->field.tqe_next->field.tqe_prev = \
412 (elm)->field.tqe_prev; \
413 else \
414 (head)->tqh_last = (elm)->field.tqe_prev; \
415 *(elm)->field.tqe_prev = (elm)->field.tqe_next; \
416} while (0)
417
418#define QTAILQ_FOREACH(var, head, field) \
419 for ((var) = ((head)->tqh_first); \
420 (var); \
421 (var) = ((var)->field.tqe_next))
422
423#define QTAILQ_FOREACH_SAFE(var, head, field, next_var) \
424 for ((var) = ((head)->tqh_first); \
425 (var) && ((next_var) = ((var)->field.tqe_next), 1); \
426 (var) = (next_var))
427
428#define QTAILQ_FOREACH_REVERSE(var, head, headname, field) \
429 for ((var) = (*(((struct headname *)((head)->tqh_last))->tqh_last)); \
430 (var); \
431 (var) = (*(((struct headname *)((var)->field.tqe_prev))->tqh_last)))
432
433
434
435
436#define QTAILQ_EMPTY(head) ((head)->tqh_first == NULL)
437#define QTAILQ_FIRST(head) ((head)->tqh_first)
438#define QTAILQ_NEXT(elm, field) ((elm)->field.tqe_next)
439
440#define QTAILQ_LAST(head, headname) \
441 (*(((struct headname *)((head)->tqh_last))->tqh_last))
442#define QTAILQ_PREV(elm, headname, field) \
443 (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last))
444
445#endif
446