queue.h
001:
002:
003:
004:
005:
006:
007:
008:
009:
010:
011:
012:
013:
014:
015:
016:
017:
018:
019:
020:
021:
022:
023:
024:
025:
026:
027:
028:
029:
030:
031:
032: #ifndef _SYS_QUEUE_H_
033: #define _SYS_QUEUE_H_
034:
035:
036:
037:
038:
039:
040:
041:
042:
043:
044:
045:
046:
047:
048:
049:
050:
051:
052:
053:
054:
055:
056:
057:
058:
059:
060:
061:
062:
063:
064:
065:
066:
067:
068:
069:
070:
071:
072:
073:
074:
075:
076:
077:
078:
079:
080:
081:
082:
083:
084: #define LIST_HEAD(name, type) \
085: struct name { \
086: struct type *lh_first; \
087: }
088:
089: #define LIST_HEAD_INITIALIZER(head) \
090: { NULL }
091:
092: #define LIST_ENTRY(type) \
093: struct { \
094: struct type *le_next; \
095: struct type **le_prev; \
096: }
097:
098:
099:
100:
101: #define LIST_INIT(head) do { \
102: (head)->lh_first = NULL; \
103: } while (0)
104:
105: #define LIST_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 LIST_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 LIST_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 LIST_REMOVE(elm, field) do { \
128: if ((elm)->field.le_next != NULL) \
129: (elm)->field.le_next->field.le_prev = \
130: (elm)->field.le_prev; \
131: *(elm)->field.le_prev = (elm)->field.le_next; \
132: } while (0)
133:
134: #define LIST_FOREACH(var, head, field) \
135: for ((var) = ((head)->lh_first); \
136: (var); \
137: (var) = ((var)->field.le_next))
138:
139:
140:
141:
142: #define LIST_EMPTY(head) ((head)->lh_first == NULL)
143: #define LIST_FIRST(head) ((head)->lh_first)
144: #define LIST_NEXT(elm, field) ((elm)->field.le_next)
145:
146:
147:
148:
149:
150: #define SLIST_HEAD(name, type) \
151: struct name { \
152: struct type *slh_first; \
153: }
154:
155: #define SLIST_HEAD_INITIALIZER(head) \
156: { NULL }
157:
158: #define SLIST_ENTRY(type) \
159: struct { \
160: struct type *sle_next; \
161: }
162:
163:
164:
165:
166: #define SLIST_INIT(head) do { \
167: (head)->slh_first = NULL; \
168: } while (0)
169:
170: #define SLIST_INSERT_AFTER(slistelm, elm, field) do { \
171: (elm)->field.sle_next = (slistelm)->field.sle_next; \
172: (slistelm)->field.sle_next = (elm); \
173: } while (0)
174:
175: #define SLIST_INSERT_HEAD(head, elm, field) do { \
176: (elm)->field.sle_next = (head)->slh_first; \
177: (head)->slh_first = (elm); \
178: } while (0)
179:
180: #define SLIST_REMOVE_HEAD(head, field) do { \
181: (head)->slh_first = (head)->slh_first->field.sle_next; \
182: } while (0)
183:
184: #define SLIST_REMOVE(head, elm, type, field) do { \
185: if ((head)->slh_first == (elm)) { \
186: SLIST_REMOVE_HEAD((head), field); \
187: } \
188: else { \
189: struct type *curelm = (head)->slh_first; \
190: while(curelm->field.sle_next != (elm)) \
191: curelm = curelm->field.sle_next; \
192: curelm->field.sle_next = \
193: curelm->field.sle_next->field.sle_next; \
194: } \
195: } while (0)
196:
197: #define SLIST_FOREACH(var, head, field) \
198: for((var) = (head)->slh_first; (var); (var) = (var)->field.sle_next)
199:
200:
201:
202:
203: #define SLIST_EMPTY(head) ((head)->slh_first == NULL)
204: #define SLIST_FIRST(head) ((head)->slh_first)
205: #define SLIST_NEXT(elm, field) ((elm)->field.sle_next)
206:
207:
208:
209:
210:
211: #define STAILQ_HEAD(name, type) \
212: struct name { \
213: struct type *stqh_first; \
214: struct type **stqh_last; \
215: }
216:
217: #define STAILQ_HEAD_INITIALIZER(head) \
218: { NULL, &(head).stqh_first }
219:
220: #define STAILQ_ENTRY(type) \
221: struct { \
222: struct type *stqe_next; \
223: }
224:
225:
226:
227:
228: #define STAILQ_INIT(head) do { \
229: (head)->stqh_first = NULL; \
230: (head)->stqh_last = &(head)->stqh_first; \
231: } while (0)
232:
233: #define STAILQ_INSERT_HEAD(head, elm, field) do { \
234: if (((elm)->field.stqe_next = (head)->stqh_first) == NULL) \
235: (head)->stqh_last = &(elm)->field.stqe_next; \
236: (head)->stqh_first = (elm); \
237: } while (0)
238:
239: #define STAILQ_INSERT_TAIL(head, elm, field) do { \
240: (elm)->field.stqe_next = NULL; \
241: *(head)->stqh_last = (elm); \
242: (head)->stqh_last = &(elm)->field.stqe_next; \
243: } while (0)
244:
245: #define STAILQ_INSERT_AFTER(head, listelm, elm, field) do { \
246: if (((elm)->field.stqe_next = (listelm)->field.stqe_next) == NULL)\
247: (head)->stqh_last = &(elm)->field.stqe_next; \
248: (listelm)->field.stqe_next = (elm); \
249: } while (0)
250:
251: #define STAILQ_REMOVE_HEAD(head, field) do { \
252: if (((head)->stqh_first = (head)->stqh_first->field.stqe_next) == NULL) \
253: (head)->stqh_last = &(head)->stqh_first; \
254: } while (0)
255:
256: #define STAILQ_REMOVE(head, elm, type, field) do { \
257: if ((head)->stqh_first == (elm)) { \
258: STAILQ_REMOVE_HEAD((head), field); \
259: } else { \
260: struct type *curelm = (head)->stqh_first; \
261: while (curelm->field.stqe_next != (elm)) \
262: curelm = curelm->field.stqe_next; \
263: if ((curelm->field.stqe_next = \
264: curelm->field.stqe_next->field.stqe_next) == NULL) \
265: (head)->stqh_last = &(curelm)->field.stqe_next; \
266: } \
267: } while (0)
268:
269: #define STAILQ_FOREACH(var, head, field) \
270: for ((var) = ((head)->stqh_first); \
271: (var); \
272: (var) = ((var)->field.stqe_next))
273:
274: #define STAILQ_CONCAT(head1, head2) do { \
275: if (!STAILQ_EMPTY((head2))) { \
276: *(head1)->stqh_last = (head2)->stqh_first; \
277: (head1)->stqh_last = (head2)->stqh_last; \
278: STAILQ_INIT((head2)); \
279: } \
280: } while (0)
281:
282:
283:
284:
285: #define STAILQ_EMPTY(head) ((head)->stqh_first == NULL)
286: #define STAILQ_FIRST(head) ((head)->stqh_first)
287: #define STAILQ_NEXT(elm, field) ((elm)->field.stqe_next)
288:
289:
290:
291:
292:
293: #define SIMPLEQ_HEAD(name, type) \
294: struct name { \
295: struct type *sqh_first; \
296: struct type **sqh_last; \
297: }
298:
299: #define SIMPLEQ_HEAD_INITIALIZER(head) \
300: { NULL, &(head).sqh_first }
301:
302: #define SIMPLEQ_ENTRY(type) \
303: struct { \
304: struct type *sqe_next; \
305: }
306:
307:
308:
309:
310: #define SIMPLEQ_INIT(head) do { \
311: (head)->sqh_first = NULL; \
312: (head)->sqh_last = &(head)->sqh_first; \
313: } while (0)
314:
315: #define SIMPLEQ_INSERT_HEAD(head, elm, field) do { \
316: if (((elm)->field.sqe_next = (head)->sqh_first) == NULL) \
317: (head)->sqh_last = &(elm)->field.sqe_next; \
318: (head)->sqh_first = (elm); \
319: } while (0)
320:
321: #define SIMPLEQ_INSERT_TAIL(head, elm, field) do { \
322: (elm)->field.sqe_next = NULL; \
323: *(head)->sqh_last = (elm); \
324: (head)->sqh_last = &(elm)->field.sqe_next; \
325: } while (0)
326:
327: #define SIMPLEQ_INSERT_AFTER(head, listelm, elm, field) do { \
328: if (((elm)->field.sqe_next = (listelm)->field.sqe_next) == NULL)\
329: (head)->sqh_last = &(elm)->field.sqe_next; \
330: (listelm)->field.sqe_next = (elm); \
331: } while (0)
332:
333: #define SIMPLEQ_REMOVE_HEAD(head, field) do { \
334: if (((head)->sqh_first = (head)->sqh_first->field.sqe_next) == NULL) \
335: (head)->sqh_last = &(head)->sqh_first; \
336: } while (0)
337:
338: #define SIMPLEQ_REMOVE(head, elm, type, field) do { \
339: if ((head)->sqh_first == (elm)) { \
340: SIMPLEQ_REMOVE_HEAD((head), field); \
341: } else { \
342: struct type *curelm = (head)->sqh_first; \
343: while (curelm->field.sqe_next != (elm)) \
344: curelm = curelm->field.sqe_next; \
345: if ((curelm->field.sqe_next = \
346: curelm->field.sqe_next->field.sqe_next) == NULL) \
347: (head)->sqh_last = &(curelm)->field.sqe_next; \
348: } \
349: } while (0)
350:
351: #define SIMPLEQ_FOREACH(var, head, field) \
352: for ((var) = ((head)->sqh_first); \
353: (var); \
354: (var) = ((var)->field.sqe_next))
355:
356:
357:
358:
359: #define SIMPLEQ_EMPTY(head) ((head)->sqh_first == NULL)
360: #define SIMPLEQ_FIRST(head) ((head)->sqh_first)
361: #define SIMPLEQ_NEXT(elm, field) ((elm)->field.sqe_next)
362:
363:
364:
365:
366:
367: #define _TAILQ_HEAD(name, type, qual) \
368: struct name { \
369: qual type *tqh_first; \
370: qual type *qual *tqh_last; \
371: }
372: #define TAILQ_HEAD(name, type) _TAILQ_HEAD(name, struct type,)
373:
374: #define TAILQ_HEAD_INITIALIZER(head) \
375: { NULL, &(head).tqh_first }
376:
377: #define _TAILQ_ENTRY(type, qual) \
378: struct { \
379: qual type *tqe_next; \
380: qual type *qual *tqe_prev; \
381: }
382: #define TAILQ_ENTRY(type) _TAILQ_ENTRY(struct type,)
383:
384:
385:
386:
387: #define TAILQ_INIT(head) do { \
388: (head)->tqh_first = NULL; \
389: (head)->tqh_last = &(head)->tqh_first; \
390: } while (0)
391:
392: #define TAILQ_INSERT_HEAD(head, elm, field) do { \
393: if (((elm)->field.tqe_next = (head)->tqh_first) != NULL) \
394: (head)->tqh_first->field.tqe_prev = \
395: &(elm)->field.tqe_next; \
396: else \
397: (head)->tqh_last = &(elm)->field.tqe_next; \
398: (head)->tqh_first = (elm); \
399: (elm)->field.tqe_prev = &(head)->tqh_first; \
400: } while (0)
401:
402: #define TAILQ_INSERT_TAIL(head, elm, field) do { \
403: (elm)->field.tqe_next = NULL; \
404: (elm)->field.tqe_prev = (head)->tqh_last; \
405: *(head)->tqh_last = (elm); \
406: (head)->tqh_last = &(elm)->field.tqe_next; \
407: } while (0)
408:
409: #define TAILQ_INSERT_AFTER(head, listelm, elm, field) do { \
410: if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != NULL)\
411: (elm)->field.tqe_next->field.tqe_prev = \
412: &(elm)->field.tqe_next; \
413: else \
414: (head)->tqh_last = &(elm)->field.tqe_next; \
415: (listelm)->field.tqe_next = (elm); \
416: (elm)->field.tqe_prev = &(listelm)->field.tqe_next; \
417: } while (0)
418:
419: #define TAILQ_INSERT_BEFORE(listelm, elm, field) do { \
420: (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \
421: (elm)->field.tqe_next = (listelm); \
422: *(listelm)->field.tqe_prev = (elm); \
423: (listelm)->field.tqe_prev = &(elm)->field.tqe_next; \
424: } while (0)
425:
426: #define TAILQ_REMOVE(head, elm, field) do { \
427: if (((elm)->field.tqe_next) != NULL) \
428: (elm)->field.tqe_next->field.tqe_prev = \
429: (elm)->field.tqe_prev; \
430: else \
431: (head)->tqh_last = (elm)->field.tqe_prev; \
432: *(elm)->field.tqe_prev = (elm)->field.tqe_next; \
433: } while (0)
434:
435: #define TAILQ_FOREACH(var, head, field) \
436: for ((var) = ((head)->tqh_first); \
437: (var); \
438: (var) = ((var)->field.tqe_next))
439:
440: #define TAILQ_FOREACH_REVERSE(var, head, headname, field) \
441: for ((var) = (*(((struct headname *)((head)->tqh_last))->tqh_last)); \
442: (var); \
443: (var) = (*(((struct headname *)((var)->field.tqe_prev))->tqh_last)))
444:
445: #define TAILQ_CONCAT(head1, head2, field) do { \
446: if (!TAILQ_EMPTY(head2)) { \
447: *(head1)->tqh_last = (head2)->tqh_first; \
448: (head2)->tqh_first->field.tqe_prev = (head1)->tqh_last; \
449: (head1)->tqh_last = (head2)->tqh_last; \
450: TAILQ_INIT((head2)); \
451: } \
452: } while (0)
453:
454:
455:
456:
457: #define TAILQ_EMPTY(head) ((head)->tqh_first == NULL)
458: #define TAILQ_FIRST(head) ((head)->tqh_first)
459: #define TAILQ_NEXT(elm, field) ((elm)->field.tqe_next)
460:
461: #define TAILQ_LAST(head, headname) \
462: (*(((struct headname *)((head)->tqh_last))->tqh_last))
463: #define TAILQ_PREV(elm, headname, field) \
464: (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last))
465:
466:
467:
468:
469:
470: #define CIRCLEQ_HEAD(name, type) \
471: struct name { \
472: struct type *cqh_first; \
473: struct type *cqh_last; \
474: }
475:
476: #define CIRCLEQ_HEAD_INITIALIZER(head) \
477: { (void *)&head, (void *)&head }
478:
479: #define CIRCLEQ_ENTRY(type) \
480: struct { \
481: struct type *cqe_next; \
482: struct type *cqe_prev; \
483: }
484:
485:
486:
487:
488: #define CIRCLEQ_INIT(head) do { \
489: (head)->cqh_first = (void *)(head); \
490: (head)->cqh_last = (void *)(head); \
491: } while (0)
492:
493: #define CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) do { \
494: (elm)->field.cqe_next = (listelm)->field.cqe_next; \
495: (elm)->field.cqe_prev = (listelm); \
496: if ((listelm)->field.cqe_next == (void *)(head)) \
497: (head)->cqh_last = (elm); \
498: else \
499: (listelm)->field.cqe_next->field.cqe_prev = (elm); \
500: (listelm)->field.cqe_next = (elm); \
501: } while (0)
502:
503: #define CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) do { \
504: (elm)->field.cqe_next = (listelm); \
505: (elm)->field.cqe_prev = (listelm)->field.cqe_prev; \
506: if ((listelm)->field.cqe_prev == (void *)(head)) \
507: (head)->cqh_first = (elm); \
508: else \
509: (listelm)->field.cqe_prev->field.cqe_next = (elm); \
510: (listelm)->field.cqe_prev = (elm); \
511: } while (0)
512:
513: #define CIRCLEQ_INSERT_HEAD(head, elm, field) do { \
514: (elm)->field.cqe_next = (head)->cqh_first; \
515: (elm)->field.cqe_prev = (void *)(head); \
516: if ((head)->cqh_last == (void *)(head)) \
517: (head)->cqh_last = (elm); \
518: else \
519: (head)->cqh_first->field.cqe_prev = (elm); \
520: (head)->cqh_first = (elm); \
521: } while (0)
522:
523: #define CIRCLEQ_INSERT_TAIL(head, elm, field) do { \
524: (elm)->field.cqe_next = (void *)(head); \
525: (elm)->field.cqe_prev = (head)->cqh_last; \
526: if ((head)->cqh_first == (void *)(head)) \
527: (head)->cqh_first = (elm); \
528: else \
529: (head)->cqh_last->field.cqe_next = (elm); \
530: (head)->cqh_last = (elm); \
531: } while (0)
532:
533: #define CIRCLEQ_REMOVE(head, elm, field) do { \
534: if ((elm)->field.cqe_next == (void *)(head)) \
535: (head)->cqh_last = (elm)->field.cqe_prev; \
536: else \
537: (elm)->field.cqe_next->field.cqe_prev = \
538: (elm)->field.cqe_prev; \
539: if ((elm)->field.cqe_prev == (void *)(head)) \
540: (head)->cqh_first = (elm)->field.cqe_next; \
541: else \
542: (elm)->field.cqe_prev->field.cqe_next = \
543: (elm)->field.cqe_next; \
544: } while (0)
545:
546: #define CIRCLEQ_FOREACH(var, head, field) \
547: for ((var) = ((head)->cqh_first); \
548: (var) != (const void *)(head); \
549: (var) = ((var)->field.cqe_next))
550:
551: #define CIRCLEQ_FOREACH_REVERSE(var, head, field) \
552: for ((var) = ((head)->cqh_last); \
553: (var) != (const void *)(head); \
554: (var) = ((var)->field.cqe_prev))
555:
556:
557:
558:
559: #define CIRCLEQ_EMPTY(head) ((head)->cqh_first == (void *)(head))
560: #define CIRCLEQ_FIRST(head) ((head)->cqh_first)
561: #define CIRCLEQ_LAST(head) ((head)->cqh_last)
562: #define CIRCLEQ_NEXT(elm, field) ((elm)->field.cqe_next)
563: #define CIRCLEQ_PREV(elm, field) ((elm)->field.cqe_prev)
564:
565: #define CIRCLEQ_LOOP_NEXT(head, elm, field) \
566: (((elm)->field.cqe_next == (void *)(head)) \
567: ? ((head)->cqh_first) \
568: : (elm->field.cqe_next))
569: #define CIRCLEQ_LOOP_PREV(head, elm, field) \
570: (((elm)->field.cqe_prev == (void *)(head)) \
571: ? ((head)->cqh_last) \
572: : (elm->field.cqe_prev))
573:
574: #endif
575:
© Andrew Scott 2006 -
2024,
All Rights Reserved