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#include "qemu-barrier.h"
80
81
82
83
84#define QLIST_HEAD(name, type) \
85struct name { \
86 struct type *lh_first; \
87}
88
89#define QLIST_HEAD_INITIALIZER(head) \
90 { NULL }
91
92#define QLIST_ENTRY(type) \
93struct { \
94 struct type *le_next; \
95 struct type **le_prev; \
96}
97
98
99
100
101#define QLIST_INIT(head) do { \
102 (head)->lh_first = NULL; \
103} while (0)
104
105#define QLIST_INSERT_AFTER(listelm, elm, field) do { \
106 if (((elm)->field.le_next = (listelm)->field.le_next) != NULL) \
107 (listelm)->field.le_next->field.le_prev = \
108 &(elm)->field.le_next; \
109 (listelm)->field.le_next = (elm); \
110 (elm)->field.le_prev = &(listelm)->field.le_next; \
111} while (0)
112
113#define QLIST_INSERT_BEFORE(listelm, elm, field) do { \
114 (elm)->field.le_prev = (listelm)->field.le_prev; \
115 (elm)->field.le_next = (listelm); \
116 *(listelm)->field.le_prev = (elm); \
117 (listelm)->field.le_prev = &(elm)->field.le_next; \
118} while (0)
119
120#define QLIST_INSERT_HEAD(head, elm, field) do { \
121 if (((elm)->field.le_next = (head)->lh_first) != NULL) \
122 (head)->lh_first->field.le_prev = &(elm)->field.le_next;\
123 (head)->lh_first = (elm); \
124 (elm)->field.le_prev = &(head)->lh_first; \
125} while (0)
126
127#define QLIST_INSERT_HEAD_RCU(head, elm, field) do { \
128 (elm)->field.le_prev = &(head)->lh_first; \
129 (elm)->field.le_next = (head)->lh_first; \
130 smp_wmb(); \
131 if ((head)->lh_first != NULL) { \
132 (head)->lh_first->field.le_prev = &(elm)->field.le_next; \
133 } \
134 (head)->lh_first = (elm); \
135 smp_wmb(); \
136} while (0)
137
138#define QLIST_REMOVE(elm, field) do { \
139 if ((elm)->field.le_next != NULL) \
140 (elm)->field.le_next->field.le_prev = \
141 (elm)->field.le_prev; \
142 *(elm)->field.le_prev = (elm)->field.le_next; \
143} while (0)
144
145#define QLIST_FOREACH(var, head, field) \
146 for ((var) = ((head)->lh_first); \
147 (var); \
148 (var) = ((var)->field.le_next))
149
150#define QLIST_FOREACH_SAFE(var, head, field, next_var) \
151 for ((var) = ((head)->lh_first); \
152 (var) && ((next_var) = ((var)->field.le_next), 1); \
153 (var) = (next_var))
154
155
156
157
158#define QLIST_EMPTY(head) ((head)->lh_first == NULL)
159#define QLIST_FIRST(head) ((head)->lh_first)
160#define QLIST_NEXT(elm, field) ((elm)->field.le_next)
161
162
163
164
165
166#define QSIMPLEQ_HEAD(name, type) \
167struct name { \
168 struct type *sqh_first; \
169 struct type **sqh_last; \
170}
171
172#define QSIMPLEQ_HEAD_INITIALIZER(head) \
173 { NULL, &(head).sqh_first }
174
175#define QSIMPLEQ_ENTRY(type) \
176struct { \
177 struct type *sqe_next; \
178}
179
180
181
182
183#define QSIMPLEQ_INIT(head) do { \
184 (head)->sqh_first = NULL; \
185 (head)->sqh_last = &(head)->sqh_first; \
186} while (0)
187
188#define QSIMPLEQ_INSERT_HEAD(head, elm, field) do { \
189 if (((elm)->field.sqe_next = (head)->sqh_first) == NULL) \
190 (head)->sqh_last = &(elm)->field.sqe_next; \
191 (head)->sqh_first = (elm); \
192} while (0)
193
194#define QSIMPLEQ_INSERT_TAIL(head, elm, field) do { \
195 (elm)->field.sqe_next = NULL; \
196 *(head)->sqh_last = (elm); \
197 (head)->sqh_last = &(elm)->field.sqe_next; \
198} while (0)
199
200#define QSIMPLEQ_INSERT_AFTER(head, listelm, elm, field) do { \
201 if (((elm)->field.sqe_next = (listelm)->field.sqe_next) == NULL) \
202 (head)->sqh_last = &(elm)->field.sqe_next; \
203 (listelm)->field.sqe_next = (elm); \
204} while (0)
205
206#define QSIMPLEQ_REMOVE_HEAD(head, field) do { \
207 if (((head)->sqh_first = (head)->sqh_first->field.sqe_next) == NULL)\
208 (head)->sqh_last = &(head)->sqh_first; \
209} while (0)
210
211#define QSIMPLEQ_REMOVE(head, elm, type, field) do { \
212 if ((head)->sqh_first == (elm)) { \
213 QSIMPLEQ_REMOVE_HEAD((head), field); \
214 } else { \
215 struct type *curelm = (head)->sqh_first; \
216 while (curelm->field.sqe_next != (elm)) \
217 curelm = curelm->field.sqe_next; \
218 if ((curelm->field.sqe_next = \
219 curelm->field.sqe_next->field.sqe_next) == NULL) \
220 (head)->sqh_last = &(curelm)->field.sqe_next; \
221 } \
222} while (0)
223
224#define QSIMPLEQ_FOREACH(var, head, field) \
225 for ((var) = ((head)->sqh_first); \
226 (var); \
227 (var) = ((var)->field.sqe_next))
228
229#define QSIMPLEQ_FOREACH_SAFE(var, head, field, next) \
230 for ((var) = ((head)->sqh_first); \
231 (var) && ((next = ((var)->field.sqe_next)), 1); \
232 (var) = (next))
233
234#define QSIMPLEQ_CONCAT(head1, head2) do { \
235 if (!QSIMPLEQ_EMPTY((head2))) { \
236 *(head1)->sqh_last = (head2)->sqh_first; \
237 (head1)->sqh_last = (head2)->sqh_last; \
238 QSIMPLEQ_INIT((head2)); \
239 } \
240} while (0)
241
242#define QSIMPLEQ_LAST(head, type, field) \
243 (QSIMPLEQ_EMPTY((head)) ? \
244 NULL : \
245 ((struct type *)(void *) \
246 ((char *)((head)->sqh_last) - offsetof(struct type, field))))
247
248
249
250
251#define QSIMPLEQ_EMPTY(head) ((head)->sqh_first == NULL)
252#define QSIMPLEQ_FIRST(head) ((head)->sqh_first)
253#define QSIMPLEQ_NEXT(elm, field) ((elm)->field.sqe_next)
254
255
256
257
258
259#define Q_TAILQ_HEAD(name, type, qual) \
260struct name { \
261 qual type *tqh_first; \
262 qual type *qual *tqh_last; \
263}
264#define QTAILQ_HEAD(name, type) Q_TAILQ_HEAD(name, struct type,)
265
266#define QTAILQ_HEAD_INITIALIZER(head) \
267 { NULL, &(head).tqh_first }
268
269#define Q_TAILQ_ENTRY(type, qual) \
270struct { \
271 qual type *tqe_next; \
272 qual type *qual *tqe_prev; \
273}
274#define QTAILQ_ENTRY(type) Q_TAILQ_ENTRY(struct type,)
275
276
277
278
279#define QTAILQ_INIT(head) do { \
280 (head)->tqh_first = NULL; \
281 (head)->tqh_last = &(head)->tqh_first; \
282} while (0)
283
284#define QTAILQ_INSERT_HEAD(head, elm, field) do { \
285 if (((elm)->field.tqe_next = (head)->tqh_first) != NULL) \
286 (head)->tqh_first->field.tqe_prev = \
287 &(elm)->field.tqe_next; \
288 else \
289 (head)->tqh_last = &(elm)->field.tqe_next; \
290 (head)->tqh_first = (elm); \
291 (elm)->field.tqe_prev = &(head)->tqh_first; \
292} while (0)
293
294#define QTAILQ_INSERT_TAIL(head, elm, field) do { \
295 (elm)->field.tqe_next = NULL; \
296 (elm)->field.tqe_prev = (head)->tqh_last; \
297 *(head)->tqh_last = (elm); \
298 (head)->tqh_last = &(elm)->field.tqe_next; \
299} while (0)
300
301#define QTAILQ_INSERT_AFTER(head, listelm, elm, field) do { \
302 if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != NULL)\
303 (elm)->field.tqe_next->field.tqe_prev = \
304 &(elm)->field.tqe_next; \
305 else \
306 (head)->tqh_last = &(elm)->field.tqe_next; \
307 (listelm)->field.tqe_next = (elm); \
308 (elm)->field.tqe_prev = &(listelm)->field.tqe_next; \
309} while (0)
310
311#define QTAILQ_INSERT_BEFORE(listelm, elm, field) do { \
312 (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \
313 (elm)->field.tqe_next = (listelm); \
314 *(listelm)->field.tqe_prev = (elm); \
315 (listelm)->field.tqe_prev = &(elm)->field.tqe_next; \
316} while (0)
317
318#define QTAILQ_REMOVE(head, elm, field) do { \
319 if (((elm)->field.tqe_next) != NULL) \
320 (elm)->field.tqe_next->field.tqe_prev = \
321 (elm)->field.tqe_prev; \
322 else \
323 (head)->tqh_last = (elm)->field.tqe_prev; \
324 *(elm)->field.tqe_prev = (elm)->field.tqe_next; \
325} while (0)
326
327#define QTAILQ_FOREACH(var, head, field) \
328 for ((var) = ((head)->tqh_first); \
329 (var); \
330 (var) = ((var)->field.tqe_next))
331
332#define QTAILQ_FOREACH_SAFE(var, head, field, next_var) \
333 for ((var) = ((head)->tqh_first); \
334 (var) && ((next_var) = ((var)->field.tqe_next), 1); \
335 (var) = (next_var))
336
337#define QTAILQ_FOREACH_REVERSE(var, head, headname, field) \
338 for ((var) = (*(((struct headname *)((head)->tqh_last))->tqh_last)); \
339 (var); \
340 (var) = (*(((struct headname *)((var)->field.tqe_prev))->tqh_last)))
341
342
343
344
345#define QTAILQ_EMPTY(head) ((head)->tqh_first == NULL)
346#define QTAILQ_FIRST(head) ((head)->tqh_first)
347#define QTAILQ_NEXT(elm, field) ((elm)->field.tqe_next)
348
349#define QTAILQ_LAST(head, headname) \
350 (*(((struct headname *)((head)->tqh_last))->tqh_last))
351#define QTAILQ_PREV(elm, headname, field) \
352 (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last))
353
354
355
356
357
358#define QCIRCLEQ_HEAD(name, type) \
359struct name { \
360 struct type *cqh_first; \
361 struct type *cqh_last; \
362}
363
364#define QCIRCLEQ_HEAD_INITIALIZER(head) \
365 { (void *)&head, (void *)&head }
366
367#define QCIRCLEQ_ENTRY(type) \
368struct { \
369 struct type *cqe_next; \
370 struct type *cqe_prev; \
371}
372
373
374
375
376#define QCIRCLEQ_INIT(head) do { \
377 (head)->cqh_first = (void *)(head); \
378 (head)->cqh_last = (void *)(head); \
379} while (0)
380
381#define QCIRCLEQ_INSERT_AFTER(head, listelm, elm, field) do { \
382 (elm)->field.cqe_next = (listelm)->field.cqe_next; \
383 (elm)->field.cqe_prev = (listelm); \
384 if ((listelm)->field.cqe_next == (void *)(head)) \
385 (head)->cqh_last = (elm); \
386 else \
387 (listelm)->field.cqe_next->field.cqe_prev = (elm); \
388 (listelm)->field.cqe_next = (elm); \
389} while (0)
390
391#define QCIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) do { \
392 (elm)->field.cqe_next = (listelm); \
393 (elm)->field.cqe_prev = (listelm)->field.cqe_prev; \
394 if ((listelm)->field.cqe_prev == (void *)(head)) \
395 (head)->cqh_first = (elm); \
396 else \
397 (listelm)->field.cqe_prev->field.cqe_next = (elm); \
398 (listelm)->field.cqe_prev = (elm); \
399} while (0)
400
401#define QCIRCLEQ_INSERT_HEAD(head, elm, field) do { \
402 (elm)->field.cqe_next = (head)->cqh_first; \
403 (elm)->field.cqe_prev = (void *)(head); \
404 if ((head)->cqh_last == (void *)(head)) \
405 (head)->cqh_last = (elm); \
406 else \
407 (head)->cqh_first->field.cqe_prev = (elm); \
408 (head)->cqh_first = (elm); \
409} while (0)
410
411#define QCIRCLEQ_INSERT_TAIL(head, elm, field) do { \
412 (elm)->field.cqe_next = (void *)(head); \
413 (elm)->field.cqe_prev = (head)->cqh_last; \
414 if ((head)->cqh_first == (void *)(head)) \
415 (head)->cqh_first = (elm); \
416 else \
417 (head)->cqh_last->field.cqe_next = (elm); \
418 (head)->cqh_last = (elm); \
419} while (0)
420
421#define QCIRCLEQ_REMOVE(head, elm, field) do { \
422 if ((elm)->field.cqe_next == (void *)(head)) \
423 (head)->cqh_last = (elm)->field.cqe_prev; \
424 else \
425 (elm)->field.cqe_next->field.cqe_prev = \
426 (elm)->field.cqe_prev; \
427 if ((elm)->field.cqe_prev == (void *)(head)) \
428 (head)->cqh_first = (elm)->field.cqe_next; \
429 else \
430 (elm)->field.cqe_prev->field.cqe_next = \
431 (elm)->field.cqe_next; \
432} while (0)
433
434#define QCIRCLEQ_FOREACH(var, head, field) \
435 for ((var) = ((head)->cqh_first); \
436 (var) != (const void *)(head); \
437 (var) = ((var)->field.cqe_next))
438
439#define QCIRCLEQ_FOREACH_REVERSE(var, head, field) \
440 for ((var) = ((head)->cqh_last); \
441 (var) != (const void *)(head); \
442 (var) = ((var)->field.cqe_prev))
443
444
445
446
447#define QCIRCLEQ_EMPTY(head) ((head)->cqh_first == (void *)(head))
448#define QCIRCLEQ_FIRST(head) ((head)->cqh_first)
449#define QCIRCLEQ_LAST(head) ((head)->cqh_last)
450#define QCIRCLEQ_NEXT(elm, field) ((elm)->field.cqe_next)
451#define QCIRCLEQ_PREV(elm, field) ((elm)->field.cqe_prev)
452
453#define QCIRCLEQ_LOOP_NEXT(head, elm, field) \
454 (((elm)->field.cqe_next == (void *)(head)) \
455 ? ((head)->cqh_first) \
456 : (elm->field.cqe_next))
457#define QCIRCLEQ_LOOP_PREV(head, elm, field) \
458 (((elm)->field.cqe_prev == (void *)(head)) \
459 ? ((head)->cqh_last) \
460 : (elm->field.cqe_prev))
461
462#endif
463