root / qemu-queue.h @ 7f23f812
History | View | Annotate | Download (17.1 kB)
1 | fc56ef08 | blueswir1 | /* $NetBSD: queue.h,v 1.45.14.1 2007/07/18 20:13:24 liamjfoy Exp $ */
|
---|---|---|---|
2 | fc56ef08 | blueswir1 | |
3 | fc56ef08 | blueswir1 | /*
|
4 | fc56ef08 | blueswir1 | * Qemu version: Copy from netbsd, removed debug code, removed some of
|
5 | fc56ef08 | blueswir1 | * the implementations. Left in lists, tail queues and circular queues.
|
6 | fc56ef08 | blueswir1 | */
|
7 | fc56ef08 | blueswir1 | |
8 | fc56ef08 | blueswir1 | /*
|
9 | fc56ef08 | blueswir1 | * Copyright (c) 1991, 1993
|
10 | fc56ef08 | blueswir1 | * The Regents of the University of California. All rights reserved.
|
11 | fc56ef08 | blueswir1 | *
|
12 | fc56ef08 | blueswir1 | * Redistribution and use in source and binary forms, with or without
|
13 | fc56ef08 | blueswir1 | * modification, are permitted provided that the following conditions
|
14 | fc56ef08 | blueswir1 | * are met:
|
15 | fc56ef08 | blueswir1 | * 1. Redistributions of source code must retain the above copyright
|
16 | fc56ef08 | blueswir1 | * notice, this list of conditions and the following disclaimer.
|
17 | fc56ef08 | blueswir1 | * 2. Redistributions in binary form must reproduce the above copyright
|
18 | fc56ef08 | blueswir1 | * notice, this list of conditions and the following disclaimer in the
|
19 | fc56ef08 | blueswir1 | * documentation and/or other materials provided with the distribution.
|
20 | fc56ef08 | blueswir1 | * 3. Neither the name of the University nor the names of its contributors
|
21 | fc56ef08 | blueswir1 | * may be used to endorse or promote products derived from this software
|
22 | fc56ef08 | blueswir1 | * without specific prior written permission.
|
23 | fc56ef08 | blueswir1 | *
|
24 | fc56ef08 | blueswir1 | * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
25 | fc56ef08 | blueswir1 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
26 | fc56ef08 | blueswir1 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
27 | fc56ef08 | blueswir1 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
28 | fc56ef08 | blueswir1 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
29 | fc56ef08 | blueswir1 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
30 | fc56ef08 | blueswir1 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
31 | fc56ef08 | blueswir1 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
32 | fc56ef08 | blueswir1 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
33 | fc56ef08 | blueswir1 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
34 | fc56ef08 | blueswir1 | * SUCH DAMAGE.
|
35 | fc56ef08 | blueswir1 | *
|
36 | fc56ef08 | blueswir1 | * @(#)queue.h 8.5 (Berkeley) 8/20/94
|
37 | fc56ef08 | blueswir1 | */
|
38 | fc56ef08 | blueswir1 | |
39 | 72cf2d4f | Blue Swirl | #ifndef QEMU_SYS_QUEUE_H_
|
40 | 72cf2d4f | Blue Swirl | #define QEMU_SYS_QUEUE_H_
|
41 | fc56ef08 | blueswir1 | |
42 | fc56ef08 | blueswir1 | /*
|
43 | fc56ef08 | blueswir1 | * This file defines three types of data structures:
|
44 | fc56ef08 | blueswir1 | * lists, tail queues, and circular queues.
|
45 | fc56ef08 | blueswir1 | *
|
46 | fc56ef08 | blueswir1 | * A list is headed by a single forward pointer (or an array of forward
|
47 | fc56ef08 | blueswir1 | * pointers for a hash table header). The elements are doubly linked
|
48 | fc56ef08 | blueswir1 | * so that an arbitrary element can be removed without a need to
|
49 | fc56ef08 | blueswir1 | * traverse the list. New elements can be added to the list before
|
50 | fc56ef08 | blueswir1 | * or after an existing element or at the head of the list. A list
|
51 | fc56ef08 | blueswir1 | * may only be traversed in the forward direction.
|
52 | fc56ef08 | blueswir1 | *
|
53 | fc56ef08 | blueswir1 | * A tail queue is headed by a pair of pointers, one to the head of the
|
54 | fc56ef08 | blueswir1 | * list and the other to the tail of the list. The elements are doubly
|
55 | fc56ef08 | blueswir1 | * linked so that an arbitrary element can be removed without a need to
|
56 | fc56ef08 | blueswir1 | * traverse the list. New elements can be added to the list before or
|
57 | fc56ef08 | blueswir1 | * after an existing element, at the head of the list, or at the end of
|
58 | fc56ef08 | blueswir1 | * the list. A tail queue may be traversed in either direction.
|
59 | fc56ef08 | blueswir1 | *
|
60 | fc56ef08 | blueswir1 | * A circle queue is headed by a pair of pointers, one to the head of the
|
61 | fc56ef08 | blueswir1 | * list and the other to the tail of the list. The elements are doubly
|
62 | fc56ef08 | blueswir1 | * linked so that an arbitrary element can be removed without a need to
|
63 | fc56ef08 | blueswir1 | * traverse the list. New elements can be added to the list before or after
|
64 | fc56ef08 | blueswir1 | * an existing element, at the head of the list, or at the end of the list.
|
65 | fc56ef08 | blueswir1 | * A circle queue may be traversed in either direction, but has a more
|
66 | fc56ef08 | blueswir1 | * complex end of list detection.
|
67 | fc56ef08 | blueswir1 | *
|
68 | fc56ef08 | blueswir1 | * For details on the use of these macros, see the queue(3) manual page.
|
69 | fc56ef08 | blueswir1 | */
|
70 | fc56ef08 | blueswir1 | |
71 | fc56ef08 | blueswir1 | /*
|
72 | fc56ef08 | blueswir1 | * List definitions.
|
73 | fc56ef08 | blueswir1 | */
|
74 | 72cf2d4f | Blue Swirl | #define QLIST_HEAD(name, type) \
|
75 | fc56ef08 | blueswir1 | struct name { \
|
76 | fc56ef08 | blueswir1 | struct type *lh_first; /* first element */ \ |
77 | fc56ef08 | blueswir1 | } |
78 | fc56ef08 | blueswir1 | |
79 | 72cf2d4f | Blue Swirl | #define QLIST_HEAD_INITIALIZER(head) \
|
80 | fc56ef08 | blueswir1 | { NULL }
|
81 | fc56ef08 | blueswir1 | |
82 | 72cf2d4f | Blue Swirl | #define QLIST_ENTRY(type) \
|
83 | fc56ef08 | blueswir1 | struct { \
|
84 | fc56ef08 | blueswir1 | struct type *le_next; /* next element */ \ |
85 | fc56ef08 | blueswir1 | struct type **le_prev; /* address of previous next element */ \ |
86 | fc56ef08 | blueswir1 | } |
87 | fc56ef08 | blueswir1 | |
88 | fc56ef08 | blueswir1 | /*
|
89 | fc56ef08 | blueswir1 | * List functions.
|
90 | fc56ef08 | blueswir1 | */
|
91 | 72cf2d4f | Blue Swirl | #define QLIST_INIT(head) do { \ |
92 | fc56ef08 | blueswir1 | (head)->lh_first = NULL; \
|
93 | fc56ef08 | blueswir1 | } while (/*CONSTCOND*/0) |
94 | fc56ef08 | blueswir1 | |
95 | 72cf2d4f | Blue Swirl | #define QLIST_INSERT_AFTER(listelm, elm, field) do { \ |
96 | fc56ef08 | blueswir1 | if (((elm)->field.le_next = (listelm)->field.le_next) != NULL) \ |
97 | fc56ef08 | blueswir1 | (listelm)->field.le_next->field.le_prev = \ |
98 | fc56ef08 | blueswir1 | &(elm)->field.le_next; \ |
99 | fc56ef08 | blueswir1 | (listelm)->field.le_next = (elm); \ |
100 | fc56ef08 | blueswir1 | (elm)->field.le_prev = &(listelm)->field.le_next; \ |
101 | fc56ef08 | blueswir1 | } while (/*CONSTCOND*/0) |
102 | fc56ef08 | blueswir1 | |
103 | 72cf2d4f | Blue Swirl | #define QLIST_INSERT_BEFORE(listelm, elm, field) do { \ |
104 | fc56ef08 | blueswir1 | (elm)->field.le_prev = (listelm)->field.le_prev; \ |
105 | fc56ef08 | blueswir1 | (elm)->field.le_next = (listelm); \ |
106 | fc56ef08 | blueswir1 | *(listelm)->field.le_prev = (elm); \ |
107 | fc56ef08 | blueswir1 | (listelm)->field.le_prev = &(elm)->field.le_next; \ |
108 | fc56ef08 | blueswir1 | } while (/*CONSTCOND*/0) |
109 | fc56ef08 | blueswir1 | |
110 | 72cf2d4f | Blue Swirl | #define QLIST_INSERT_HEAD(head, elm, field) do { \ |
111 | fc56ef08 | blueswir1 | if (((elm)->field.le_next = (head)->lh_first) != NULL) \ |
112 | fc56ef08 | blueswir1 | (head)->lh_first->field.le_prev = &(elm)->field.le_next;\ |
113 | fc56ef08 | blueswir1 | (head)->lh_first = (elm); \ |
114 | fc56ef08 | blueswir1 | (elm)->field.le_prev = &(head)->lh_first; \ |
115 | fc56ef08 | blueswir1 | } while (/*CONSTCOND*/0) |
116 | fc56ef08 | blueswir1 | |
117 | 72cf2d4f | Blue Swirl | #define QLIST_REMOVE(elm, field) do { \ |
118 | fc56ef08 | blueswir1 | if ((elm)->field.le_next != NULL) \ |
119 | fc56ef08 | blueswir1 | (elm)->field.le_next->field.le_prev = \ |
120 | fc56ef08 | blueswir1 | (elm)->field.le_prev; \ |
121 | fc56ef08 | blueswir1 | *(elm)->field.le_prev = (elm)->field.le_next; \ |
122 | fc56ef08 | blueswir1 | } while (/*CONSTCOND*/0) |
123 | fc56ef08 | blueswir1 | |
124 | 72cf2d4f | Blue Swirl | #define QLIST_FOREACH(var, head, field) \
|
125 | fc56ef08 | blueswir1 | for ((var) = ((head)->lh_first); \
|
126 | fc56ef08 | blueswir1 | (var); \ |
127 | fc56ef08 | blueswir1 | (var) = ((var)->field.le_next)) |
128 | fc56ef08 | blueswir1 | |
129 | 72cf2d4f | Blue Swirl | #define QLIST_FOREACH_SAFE(var, head, field, next_var) \
|
130 | bb150dc8 | Juan Quintela | for ((var) = ((head)->lh_first); \
|
131 | bb150dc8 | Juan Quintela | (var) && ((next_var) = ((var)->field.le_next), 1); \
|
132 | bb150dc8 | Juan Quintela | (var) = (next_var)) |
133 | bb150dc8 | Juan Quintela | |
134 | fc56ef08 | blueswir1 | /*
|
135 | fc56ef08 | blueswir1 | * List access methods.
|
136 | fc56ef08 | blueswir1 | */
|
137 | 72cf2d4f | Blue Swirl | #define QLIST_EMPTY(head) ((head)->lh_first == NULL) |
138 | 72cf2d4f | Blue Swirl | #define QLIST_FIRST(head) ((head)->lh_first)
|
139 | 72cf2d4f | Blue Swirl | #define QLIST_NEXT(elm, field) ((elm)->field.le_next)
|
140 | fc56ef08 | blueswir1 | |
141 | fc56ef08 | blueswir1 | |
142 | fc56ef08 | blueswir1 | /*
|
143 | fc56ef08 | blueswir1 | * Tail queue definitions.
|
144 | fc56ef08 | blueswir1 | */
|
145 | 72cf2d4f | Blue Swirl | #define Q_TAILQ_HEAD(name, type, qual) \
|
146 | fc56ef08 | blueswir1 | struct name { \
|
147 | fc56ef08 | blueswir1 | qual type *tqh_first; /* first element */ \
|
148 | fc56ef08 | blueswir1 | qual type *qual *tqh_last; /* addr of last next element */ \
|
149 | fc56ef08 | blueswir1 | } |
150 | 72cf2d4f | Blue Swirl | #define QTAILQ_HEAD(name, type) Q_TAILQ_HEAD(name, struct type,) |
151 | fc56ef08 | blueswir1 | |
152 | 72cf2d4f | Blue Swirl | #define QTAILQ_HEAD_INITIALIZER(head) \
|
153 | fc56ef08 | blueswir1 | { NULL, &(head).tqh_first }
|
154 | fc56ef08 | blueswir1 | |
155 | 72cf2d4f | Blue Swirl | #define Q_TAILQ_ENTRY(type, qual) \
|
156 | fc56ef08 | blueswir1 | struct { \
|
157 | fc56ef08 | blueswir1 | qual type *tqe_next; /* next element */ \
|
158 | fc56ef08 | blueswir1 | qual type *qual *tqe_prev; /* address of previous next element */\
|
159 | fc56ef08 | blueswir1 | } |
160 | 72cf2d4f | Blue Swirl | #define QTAILQ_ENTRY(type) Q_TAILQ_ENTRY(struct type,) |
161 | fc56ef08 | blueswir1 | |
162 | fc56ef08 | blueswir1 | /*
|
163 | fc56ef08 | blueswir1 | * Tail queue functions.
|
164 | fc56ef08 | blueswir1 | */
|
165 | 72cf2d4f | Blue Swirl | #define QTAILQ_INIT(head) do { \ |
166 | fc56ef08 | blueswir1 | (head)->tqh_first = NULL; \
|
167 | fc56ef08 | blueswir1 | (head)->tqh_last = &(head)->tqh_first; \ |
168 | fc56ef08 | blueswir1 | } while (/*CONSTCOND*/0) |
169 | fc56ef08 | blueswir1 | |
170 | 72cf2d4f | Blue Swirl | #define QTAILQ_INSERT_HEAD(head, elm, field) do { \ |
171 | fc56ef08 | blueswir1 | if (((elm)->field.tqe_next = (head)->tqh_first) != NULL) \ |
172 | fc56ef08 | blueswir1 | (head)->tqh_first->field.tqe_prev = \ |
173 | fc56ef08 | blueswir1 | &(elm)->field.tqe_next; \ |
174 | fc56ef08 | blueswir1 | else \
|
175 | fc56ef08 | blueswir1 | (head)->tqh_last = &(elm)->field.tqe_next; \ |
176 | fc56ef08 | blueswir1 | (head)->tqh_first = (elm); \ |
177 | fc56ef08 | blueswir1 | (elm)->field.tqe_prev = &(head)->tqh_first; \ |
178 | fc56ef08 | blueswir1 | } while (/*CONSTCOND*/0) |
179 | fc56ef08 | blueswir1 | |
180 | 72cf2d4f | Blue Swirl | #define QTAILQ_INSERT_TAIL(head, elm, field) do { \ |
181 | fc56ef08 | blueswir1 | (elm)->field.tqe_next = NULL; \
|
182 | fc56ef08 | blueswir1 | (elm)->field.tqe_prev = (head)->tqh_last; \ |
183 | fc56ef08 | blueswir1 | *(head)->tqh_last = (elm); \ |
184 | fc56ef08 | blueswir1 | (head)->tqh_last = &(elm)->field.tqe_next; \ |
185 | fc56ef08 | blueswir1 | } while (/*CONSTCOND*/0) |
186 | fc56ef08 | blueswir1 | |
187 | 72cf2d4f | Blue Swirl | #define QTAILQ_INSERT_AFTER(head, listelm, elm, field) do { \ |
188 | fc56ef08 | blueswir1 | if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != NULL)\ |
189 | fc56ef08 | blueswir1 | (elm)->field.tqe_next->field.tqe_prev = \ |
190 | fc56ef08 | blueswir1 | &(elm)->field.tqe_next; \ |
191 | fc56ef08 | blueswir1 | else \
|
192 | fc56ef08 | blueswir1 | (head)->tqh_last = &(elm)->field.tqe_next; \ |
193 | fc56ef08 | blueswir1 | (listelm)->field.tqe_next = (elm); \ |
194 | fc56ef08 | blueswir1 | (elm)->field.tqe_prev = &(listelm)->field.tqe_next; \ |
195 | fc56ef08 | blueswir1 | } while (/*CONSTCOND*/0) |
196 | fc56ef08 | blueswir1 | |
197 | 72cf2d4f | Blue Swirl | #define QTAILQ_INSERT_BEFORE(listelm, elm, field) do { \ |
198 | fc56ef08 | blueswir1 | (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \ |
199 | fc56ef08 | blueswir1 | (elm)->field.tqe_next = (listelm); \ |
200 | fc56ef08 | blueswir1 | *(listelm)->field.tqe_prev = (elm); \ |
201 | fc56ef08 | blueswir1 | (listelm)->field.tqe_prev = &(elm)->field.tqe_next; \ |
202 | fc56ef08 | blueswir1 | } while (/*CONSTCOND*/0) |
203 | fc56ef08 | blueswir1 | |
204 | 72cf2d4f | Blue Swirl | #define QTAILQ_REMOVE(head, elm, field) do { \ |
205 | fc56ef08 | blueswir1 | if (((elm)->field.tqe_next) != NULL) \ |
206 | fc56ef08 | blueswir1 | (elm)->field.tqe_next->field.tqe_prev = \ |
207 | fc56ef08 | blueswir1 | (elm)->field.tqe_prev; \ |
208 | fc56ef08 | blueswir1 | else \
|
209 | fc56ef08 | blueswir1 | (head)->tqh_last = (elm)->field.tqe_prev; \ |
210 | fc56ef08 | blueswir1 | *(elm)->field.tqe_prev = (elm)->field.tqe_next; \ |
211 | fc56ef08 | blueswir1 | } while (/*CONSTCOND*/0) |
212 | fc56ef08 | blueswir1 | |
213 | 72cf2d4f | Blue Swirl | #define QTAILQ_FOREACH(var, head, field) \
|
214 | fc56ef08 | blueswir1 | for ((var) = ((head)->tqh_first); \
|
215 | fc56ef08 | blueswir1 | (var); \ |
216 | fc56ef08 | blueswir1 | (var) = ((var)->field.tqe_next)) |
217 | fc56ef08 | blueswir1 | |
218 | 72cf2d4f | Blue Swirl | #define QTAILQ_FOREACH_SAFE(var, head, field, next_var) \
|
219 | fc56ef08 | blueswir1 | for ((var) = ((head)->tqh_first); \
|
220 | fc56ef08 | blueswir1 | (var) && ((next_var) = ((var)->field.tqe_next), 1); \
|
221 | fc56ef08 | blueswir1 | (var) = (next_var)) |
222 | fc56ef08 | blueswir1 | |
223 | 72cf2d4f | Blue Swirl | #define QTAILQ_FOREACH_REVERSE(var, head, headname, field) \
|
224 | fc56ef08 | blueswir1 | for ((var) = (*(((struct headname *)((head)->tqh_last))->tqh_last)); \ |
225 | fc56ef08 | blueswir1 | (var); \ |
226 | fc56ef08 | blueswir1 | (var) = (*(((struct headname *)((var)->field.tqe_prev))->tqh_last)))
|
227 | fc56ef08 | blueswir1 | |
228 | fc56ef08 | blueswir1 | /*
|
229 | fc56ef08 | blueswir1 | * Tail queue access methods.
|
230 | fc56ef08 | blueswir1 | */
|
231 | 72cf2d4f | Blue Swirl | #define QTAILQ_EMPTY(head) ((head)->tqh_first == NULL) |
232 | 72cf2d4f | Blue Swirl | #define QTAILQ_FIRST(head) ((head)->tqh_first)
|
233 | 72cf2d4f | Blue Swirl | #define QTAILQ_NEXT(elm, field) ((elm)->field.tqe_next)
|
234 | fc56ef08 | blueswir1 | |
235 | 72cf2d4f | Blue Swirl | #define QTAILQ_LAST(head, headname) \
|
236 | fc56ef08 | blueswir1 | (*(((struct headname *)((head)->tqh_last))->tqh_last))
|
237 | 72cf2d4f | Blue Swirl | #define QTAILQ_PREV(elm, headname, field) \
|
238 | fc56ef08 | blueswir1 | (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last))
|
239 | fc56ef08 | blueswir1 | |
240 | fc56ef08 | blueswir1 | |
241 | fc56ef08 | blueswir1 | /*
|
242 | fc56ef08 | blueswir1 | * Circular queue definitions.
|
243 | fc56ef08 | blueswir1 | */
|
244 | 72cf2d4f | Blue Swirl | #define QCIRCLEQ_HEAD(name, type) \
|
245 | fc56ef08 | blueswir1 | struct name { \
|
246 | fc56ef08 | blueswir1 | struct type *cqh_first; /* first element */ \ |
247 | fc56ef08 | blueswir1 | struct type *cqh_last; /* last element */ \ |
248 | fc56ef08 | blueswir1 | } |
249 | fc56ef08 | blueswir1 | |
250 | 72cf2d4f | Blue Swirl | #define QCIRCLEQ_HEAD_INITIALIZER(head) \
|
251 | fc56ef08 | blueswir1 | { (void *)&head, (void *)&head } |
252 | fc56ef08 | blueswir1 | |
253 | 72cf2d4f | Blue Swirl | #define QCIRCLEQ_ENTRY(type) \
|
254 | fc56ef08 | blueswir1 | struct { \
|
255 | fc56ef08 | blueswir1 | struct type *cqe_next; /* next element */ \ |
256 | fc56ef08 | blueswir1 | struct type *cqe_prev; /* previous element */ \ |
257 | fc56ef08 | blueswir1 | } |
258 | fc56ef08 | blueswir1 | |
259 | fc56ef08 | blueswir1 | /*
|
260 | fc56ef08 | blueswir1 | * Circular queue functions.
|
261 | fc56ef08 | blueswir1 | */
|
262 | 72cf2d4f | Blue Swirl | #define QCIRCLEQ_INIT(head) do { \ |
263 | fc56ef08 | blueswir1 | (head)->cqh_first = (void *)(head); \
|
264 | fc56ef08 | blueswir1 | (head)->cqh_last = (void *)(head); \
|
265 | fc56ef08 | blueswir1 | } while (/*CONSTCOND*/0) |
266 | fc56ef08 | blueswir1 | |
267 | 72cf2d4f | Blue Swirl | #define QCIRCLEQ_INSERT_AFTER(head, listelm, elm, field) do { \ |
268 | fc56ef08 | blueswir1 | (elm)->field.cqe_next = (listelm)->field.cqe_next; \ |
269 | fc56ef08 | blueswir1 | (elm)->field.cqe_prev = (listelm); \ |
270 | fc56ef08 | blueswir1 | if ((listelm)->field.cqe_next == (void *)(head)) \ |
271 | fc56ef08 | blueswir1 | (head)->cqh_last = (elm); \ |
272 | fc56ef08 | blueswir1 | else \
|
273 | fc56ef08 | blueswir1 | (listelm)->field.cqe_next->field.cqe_prev = (elm); \ |
274 | fc56ef08 | blueswir1 | (listelm)->field.cqe_next = (elm); \ |
275 | fc56ef08 | blueswir1 | } while (/*CONSTCOND*/0) |
276 | fc56ef08 | blueswir1 | |
277 | 72cf2d4f | Blue Swirl | #define QCIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) do { \ |
278 | fc56ef08 | blueswir1 | (elm)->field.cqe_next = (listelm); \ |
279 | fc56ef08 | blueswir1 | (elm)->field.cqe_prev = (listelm)->field.cqe_prev; \ |
280 | fc56ef08 | blueswir1 | if ((listelm)->field.cqe_prev == (void *)(head)) \ |
281 | fc56ef08 | blueswir1 | (head)->cqh_first = (elm); \ |
282 | fc56ef08 | blueswir1 | else \
|
283 | fc56ef08 | blueswir1 | (listelm)->field.cqe_prev->field.cqe_next = (elm); \ |
284 | fc56ef08 | blueswir1 | (listelm)->field.cqe_prev = (elm); \ |
285 | fc56ef08 | blueswir1 | } while (/*CONSTCOND*/0) |
286 | fc56ef08 | blueswir1 | |
287 | 72cf2d4f | Blue Swirl | #define QCIRCLEQ_INSERT_HEAD(head, elm, field) do { \ |
288 | fc56ef08 | blueswir1 | (elm)->field.cqe_next = (head)->cqh_first; \ |
289 | fc56ef08 | blueswir1 | (elm)->field.cqe_prev = (void *)(head); \
|
290 | fc56ef08 | blueswir1 | if ((head)->cqh_last == (void *)(head)) \ |
291 | fc56ef08 | blueswir1 | (head)->cqh_last = (elm); \ |
292 | fc56ef08 | blueswir1 | else \
|
293 | fc56ef08 | blueswir1 | (head)->cqh_first->field.cqe_prev = (elm); \ |
294 | fc56ef08 | blueswir1 | (head)->cqh_first = (elm); \ |
295 | fc56ef08 | blueswir1 | } while (/*CONSTCOND*/0) |
296 | fc56ef08 | blueswir1 | |
297 | 72cf2d4f | Blue Swirl | #define QCIRCLEQ_INSERT_TAIL(head, elm, field) do { \ |
298 | fc56ef08 | blueswir1 | (elm)->field.cqe_next = (void *)(head); \
|
299 | fc56ef08 | blueswir1 | (elm)->field.cqe_prev = (head)->cqh_last; \ |
300 | fc56ef08 | blueswir1 | if ((head)->cqh_first == (void *)(head)) \ |
301 | fc56ef08 | blueswir1 | (head)->cqh_first = (elm); \ |
302 | fc56ef08 | blueswir1 | else \
|
303 | fc56ef08 | blueswir1 | (head)->cqh_last->field.cqe_next = (elm); \ |
304 | fc56ef08 | blueswir1 | (head)->cqh_last = (elm); \ |
305 | fc56ef08 | blueswir1 | } while (/*CONSTCOND*/0) |
306 | fc56ef08 | blueswir1 | |
307 | 72cf2d4f | Blue Swirl | #define QCIRCLEQ_REMOVE(head, elm, field) do { \ |
308 | fc56ef08 | blueswir1 | if ((elm)->field.cqe_next == (void *)(head)) \ |
309 | fc56ef08 | blueswir1 | (head)->cqh_last = (elm)->field.cqe_prev; \ |
310 | fc56ef08 | blueswir1 | else \
|
311 | fc56ef08 | blueswir1 | (elm)->field.cqe_next->field.cqe_prev = \ |
312 | fc56ef08 | blueswir1 | (elm)->field.cqe_prev; \ |
313 | fc56ef08 | blueswir1 | if ((elm)->field.cqe_prev == (void *)(head)) \ |
314 | fc56ef08 | blueswir1 | (head)->cqh_first = (elm)->field.cqe_next; \ |
315 | fc56ef08 | blueswir1 | else \
|
316 | fc56ef08 | blueswir1 | (elm)->field.cqe_prev->field.cqe_next = \ |
317 | fc56ef08 | blueswir1 | (elm)->field.cqe_next; \ |
318 | fc56ef08 | blueswir1 | } while (/*CONSTCOND*/0) |
319 | fc56ef08 | blueswir1 | |
320 | 72cf2d4f | Blue Swirl | #define QCIRCLEQ_FOREACH(var, head, field) \
|
321 | fc56ef08 | blueswir1 | for ((var) = ((head)->cqh_first); \
|
322 | fc56ef08 | blueswir1 | (var) != (const void *)(head); \ |
323 | fc56ef08 | blueswir1 | (var) = ((var)->field.cqe_next)) |
324 | fc56ef08 | blueswir1 | |
325 | 72cf2d4f | Blue Swirl | #define QCIRCLEQ_FOREACH_REVERSE(var, head, field) \
|
326 | fc56ef08 | blueswir1 | for ((var) = ((head)->cqh_last); \
|
327 | fc56ef08 | blueswir1 | (var) != (const void *)(head); \ |
328 | fc56ef08 | blueswir1 | (var) = ((var)->field.cqe_prev)) |
329 | fc56ef08 | blueswir1 | |
330 | fc56ef08 | blueswir1 | /*
|
331 | fc56ef08 | blueswir1 | * Circular queue access methods.
|
332 | fc56ef08 | blueswir1 | */
|
333 | 72cf2d4f | Blue Swirl | #define QCIRCLEQ_EMPTY(head) ((head)->cqh_first == (void *)(head)) |
334 | 72cf2d4f | Blue Swirl | #define QCIRCLEQ_FIRST(head) ((head)->cqh_first)
|
335 | 72cf2d4f | Blue Swirl | #define QCIRCLEQ_LAST(head) ((head)->cqh_last)
|
336 | 72cf2d4f | Blue Swirl | #define QCIRCLEQ_NEXT(elm, field) ((elm)->field.cqe_next)
|
337 | 72cf2d4f | Blue Swirl | #define QCIRCLEQ_PREV(elm, field) ((elm)->field.cqe_prev)
|
338 | fc56ef08 | blueswir1 | |
339 | 72cf2d4f | Blue Swirl | #define QCIRCLEQ_LOOP_NEXT(head, elm, field) \
|
340 | fc56ef08 | blueswir1 | (((elm)->field.cqe_next == (void *)(head)) \
|
341 | fc56ef08 | blueswir1 | ? ((head)->cqh_first) \ |
342 | fc56ef08 | blueswir1 | : (elm->field.cqe_next)) |
343 | 72cf2d4f | Blue Swirl | #define QCIRCLEQ_LOOP_PREV(head, elm, field) \
|
344 | fc56ef08 | blueswir1 | (((elm)->field.cqe_prev == (void *)(head)) \
|
345 | fc56ef08 | blueswir1 | ? ((head)->cqh_last) \ |
346 | fc56ef08 | blueswir1 | : (elm->field.cqe_prev)) |
347 | fc56ef08 | blueswir1 | |
348 | 72cf2d4f | Blue Swirl | #endif /* !QEMU_SYS_QUEUE_H_ */ |