Commit fc56ef08b9bb8cc1478fa0758c2bc65f1b6a9a79

Authored by blueswir1
1 parent e2832619

Remove CRs

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