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: #ifndef _SYS_QUEUE_H_
36: #define _SYS_QUEUE_H_
37:
38: 39: 40: 41: 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: 82: 83:
84:
85: #if defined(QUEUE_MACRO_DEBUG) || (defined(_KERNEL) && defined(DIAGNOSTIC))
86: #define _Q_INVALIDATE(a) (a) = ((void *)-1)
87: #else
88: #define _Q_INVALIDATE(a)
89: #endif
90:
91: 92: 93:
94: #define SLIST_HEAD(name, type) \
95: struct name { \
96: struct type *slh_first; \
97: }
98:
99: #define SLIST_HEAD_INITIALIZER(head) \
100: { NULL }
101:
102: #define SLIST_ENTRY(type) \
103: struct { \
104: struct type *sle_next; \
105: }
106:
107: 108: 109:
110: #define SLIST_FIRST(head) ((head)->slh_first)
111: #define SLIST_END(head) NULL
112: #define SLIST_EMPTY(head) (SLIST_FIRST(head) == SLIST_END(head))
113: #define SLIST_NEXT(elm, field) ((elm)->field.sle_next)
114:
115: #define SLIST_FOREACH(var, head, field) \
116: for((var) = SLIST_FIRST(head); \
117: (var) != SLIST_END(head); \
118: (var) = SLIST_NEXT(var, field))
119:
120: #define SLIST_FOREACH_SAFE(var, head, field, tvar) \
121: for ((var) = SLIST_FIRST(head); \
122: (var) && ((tvar) = SLIST_NEXT(var, field), 1); \
123: (var) = (tvar))
124:
125: 126: 127:
128: #define SLIST_INIT(head) { \
129: SLIST_FIRST(head) = SLIST_END(head); \
130: }
131:
132: #define SLIST_INSERT_AFTER(slistelm, elm, field) do { \
133: (elm)->field.sle_next = (slistelm)->field.sle_next; \
134: (slistelm)->field.sle_next = (elm); \
135: } while (0)
136:
137: #define SLIST_INSERT_HEAD(head, elm, field) do { \
138: (elm)->field.sle_next = (head)->slh_first; \
139: (head)->slh_first = (elm); \
140: } while (0)
141:
142: #define SLIST_REMOVE_NEXT(head, elm, field) do { \
143: (elm)->field.sle_next = (elm)->field.sle_next->field.sle_next; \
144: } while (0)
145:
146: #define SLIST_REMOVE_HEAD(head, field) do { \
147: (head)->slh_first = (head)->slh_first->field.sle_next; \
148: } while (0)
149:
150: #define SLIST_REMOVE(head, elm, type, field) do { \
151: if ((head)->slh_first == (elm)) { \
152: SLIST_REMOVE_HEAD((head), field); \
153: } else { \
154: struct type *curelm = (head)->slh_first; \
155: \
156: while (curelm->field.sle_next != (elm)) \
157: curelm = curelm->field.sle_next; \
158: curelm->field.sle_next = \
159: curelm->field.sle_next->field.sle_next; \
160: _Q_INVALIDATE((elm)->field.sle_next); \
161: } \
162: } while (0)
163:
164: 165: 166:
167: #define LIST_HEAD(name, type) \
168: struct name { \
169: struct type *lh_first; \
170: }
171:
172: #define LIST_HEAD_INITIALIZER(head) \
173: { NULL }
174:
175: #define LIST_ENTRY(type) \
176: struct { \
177: struct type *le_next; \
178: struct type **le_prev; \
179: }
180:
181: 182: 183:
184: #define LIST_FIRST(head) ((head)->lh_first)
185: #define LIST_END(head) NULL
186: #define LIST_EMPTY(head) (LIST_FIRST(head) == LIST_END(head))
187: #define LIST_NEXT(elm, field) ((elm)->field.le_next)
188:
189: #define LIST_FOREACH(var, head, field) \
190: for((var) = LIST_FIRST(head); \
191: (var)!= LIST_END(head); \
192: (var) = LIST_NEXT(var, field))
193:
194: #define LIST_FOREACH_SAFE(var, head, field, tvar) \
195: for ((var) = LIST_FIRST(head); \
196: (var) && ((tvar) = LIST_NEXT(var, field), 1); \
197: (var) = (tvar))
198:
199: 200: 201:
202: #define LIST_INIT(head) do { \
203: LIST_FIRST(head) = LIST_END(head); \
204: } while (0)
205:
206: #define LIST_INSERT_AFTER(listelm, elm, field) do { \
207: if (((elm)->field.le_next = (listelm)->field.le_next) != NULL) \
208: (listelm)->field.le_next->field.le_prev = \
209: &(elm)->field.le_next; \
210: (listelm)->field.le_next = (elm); \
211: (elm)->field.le_prev = &(listelm)->field.le_next; \
212: } while (0)
213:
214: #define LIST_INSERT_BEFORE(listelm, elm, field) do { \
215: (elm)->field.le_prev = (listelm)->field.le_prev; \
216: (elm)->field.le_next = (listelm); \
217: *(listelm)->field.le_prev = (elm); \
218: (listelm)->field.le_prev = &(elm)->field.le_next; \
219: } while (0)
220:
221: #define LIST_INSERT_HEAD(head, elm, field) do { \
222: if (((elm)->field.le_next = (head)->lh_first) != NULL) \
223: (head)->lh_first->field.le_prev = &(elm)->field.le_next;\
224: (head)->lh_first = (elm); \
225: (elm)->field.le_prev = &(head)->lh_first; \
226: } while (0)
227:
228: #define LIST_REMOVE(elm, field) do { \
229: if ((elm)->field.le_next != NULL) \
230: (elm)->field.le_next->field.le_prev = \
231: (elm)->field.le_prev; \
232: *(elm)->field.le_prev = (elm)->field.le_next; \
233: _Q_INVALIDATE((elm)->field.le_prev); \
234: _Q_INVALIDATE((elm)->field.le_next); \
235: } while (0)
236:
237: #define LIST_REPLACE(elm, elm2, field) do { \
238: if (((elm2)->field.le_next = (elm)->field.le_next) != NULL) \
239: (elm2)->field.le_next->field.le_prev = \
240: &(elm2)->field.le_next; \
241: (elm2)->field.le_prev = (elm)->field.le_prev; \
242: *(elm2)->field.le_prev = (elm2); \
243: _Q_INVALIDATE((elm)->field.le_prev); \
244: _Q_INVALIDATE((elm)->field.le_next); \
245: } while (0)
246:
247: 248: 249:
250: #define SIMPLEQ_HEAD(name, type) \
251: struct name { \
252: struct type *sqh_first; \
253: struct type **sqh_last; \
254: }
255:
256: #define SIMPLEQ_HEAD_INITIALIZER(head) \
257: { NULL, &(head).sqh_first }
258:
259: #define SIMPLEQ_ENTRY(type) \
260: struct { \
261: struct type *sqe_next; \
262: }
263:
264: 265: 266:
267: #define SIMPLEQ_FIRST(head) ((head)->sqh_first)
268: #define SIMPLEQ_END(head) NULL
269: #define SIMPLEQ_EMPTY(head) (SIMPLEQ_FIRST(head) == SIMPLEQ_END(head))
270: #define SIMPLEQ_NEXT(elm, field) ((elm)->field.sqe_next)
271:
272: #define SIMPLEQ_FOREACH(var, head, field) \
273: for((var) = SIMPLEQ_FIRST(head); \
274: (var) != SIMPLEQ_END(head); \
275: (var) = SIMPLEQ_NEXT(var, field))
276:
277: #define SIMPLEQ_FOREACH_SAFE(var, head, field, tvar) \
278: for ((var) = SIMPLEQ_FIRST(head); \
279: (var) && ((tvar) = SIMPLEQ_NEXT(var, field), 1); \
280: (var) = (tvar))
281:
282: 283: 284:
285: #define SIMPLEQ_INIT(head) do { \
286: (head)->sqh_first = NULL; \
287: (head)->sqh_last = &(head)->sqh_first; \
288: } while (0)
289:
290: #define SIMPLEQ_INSERT_HEAD(head, elm, field) do { \
291: if (((elm)->field.sqe_next = (head)->sqh_first) == NULL) \
292: (head)->sqh_last = &(elm)->field.sqe_next; \
293: (head)->sqh_first = (elm); \
294: } while (0)
295:
296: #define SIMPLEQ_INSERT_TAIL(head, elm, field) do { \
297: (elm)->field.sqe_next = NULL; \
298: *(head)->sqh_last = (elm); \
299: (head)->sqh_last = &(elm)->field.sqe_next; \
300: } while (0)
301:
302: #define SIMPLEQ_INSERT_AFTER(head, listelm, elm, field) do { \
303: if (((elm)->field.sqe_next = (listelm)->field.sqe_next) == NULL)\
304: (head)->sqh_last = &(elm)->field.sqe_next; \
305: (listelm)->field.sqe_next = (elm); \
306: } while (0)
307:
308: #define SIMPLEQ_REMOVE_HEAD(head, field) do { \
309: if (((head)->sqh_first = (head)->sqh_first->field.sqe_next) == NULL) \
310: (head)->sqh_last = &(head)->sqh_first; \
311: } while (0)
312:
313: #define SIMPLEQ_REMOVE_NEXT(head, elm, field) do { \
314: if (((elm)->field.sqe_next = (elm)->field.sqe_next->field.sqe_next) \
315: == NULL) \
316: (head)->sqh_last = &(elm)->field.sqe_next; \
317: } while (0)
318:
319: 320: 321:
322: #define TAILQ_HEAD(name, type) \
323: struct name { \
324: struct type *tqh_first; \
325: struct type **tqh_last; \
326: }
327:
328: #define TAILQ_HEAD_INITIALIZER(head) \
329: { NULL, &(head).tqh_first }
330:
331: #define TAILQ_ENTRY(type) \
332: struct { \
333: struct type *tqe_next; \
334: struct type **tqe_prev; \
335: }
336:
337: 338: 339:
340: #define TAILQ_FIRST(head) ((head)->tqh_first)
341: #define TAILQ_END(head) NULL
342: #define TAILQ_NEXT(elm, field) ((elm)->field.tqe_next)
343: #define TAILQ_LAST(head, headname) \
344: (*(((struct headname *)((head)->tqh_last))->tqh_last))
345:
346: #define TAILQ_PREV(elm, headname, field) \
347: (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last))
348: #define TAILQ_EMPTY(head) \
349: (TAILQ_FIRST(head) == TAILQ_END(head))
350:
351: #define TAILQ_FOREACH(var, head, field) \
352: for((var) = TAILQ_FIRST(head); \
353: (var) != TAILQ_END(head); \
354: (var) = TAILQ_NEXT(var, field))
355:
356: #define TAILQ_FOREACH_SAFE(var, head, field, tvar) \
357: for ((var) = TAILQ_FIRST(head); \
358: (var) != TAILQ_END(head) && \
359: ((tvar) = TAILQ_NEXT(var, field), 1); \
360: (var) = (tvar))
361:
362:
363: #define TAILQ_FOREACH_REVERSE(var, head, headname, field) \
364: for((var) = TAILQ_LAST(head, headname); \
365: (var) != TAILQ_END(head); \
366: (var) = TAILQ_PREV(var, headname, field))
367:
368: #define TAILQ_FOREACH_REVERSE_SAFE(var, head, headname, field, tvar) \
369: for ((var) = TAILQ_LAST(head, headname); \
370: (var) != TAILQ_END(head) && \
371: ((tvar) = TAILQ_PREV(var, headname, field), 1); \
372: (var) = (tvar))
373:
374: 375: 376:
377: #define TAILQ_INIT(head) do { \
378: (head)->tqh_first = NULL; \
379: (head)->tqh_last = &(head)->tqh_first; \
380: } while (0)
381:
382: #define TAILQ_INSERT_HEAD(head, elm, field) do { \
383: if (((elm)->field.tqe_next = (head)->tqh_first) != NULL) \
384: (head)->tqh_first->field.tqe_prev = \
385: &(elm)->field.tqe_next; \
386: else \
387: (head)->tqh_last = &(elm)->field.tqe_next; \
388: (head)->tqh_first = (elm); \
389: (elm)->field.tqe_prev = &(head)->tqh_first; \
390: } while (0)
391:
392: #define TAILQ_INSERT_TAIL(head, elm, field) do { \
393: (elm)->field.tqe_next = NULL; \
394: (elm)->field.tqe_prev = (head)->tqh_last; \
395: *(head)->tqh_last = (elm); \
396: (head)->tqh_last = &(elm)->field.tqe_next; \
397: } while (0)
398:
399: #define TAILQ_INSERT_AFTER(head, listelm, elm, field) do { \
400: if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != NULL)\
401: (elm)->field.tqe_next->field.tqe_prev = \
402: &(elm)->field.tqe_next; \
403: else \
404: (head)->tqh_last = &(elm)->field.tqe_next; \
405: (listelm)->field.tqe_next = (elm); \
406: (elm)->field.tqe_prev = &(listelm)->field.tqe_next; \
407: } while (0)
408:
409: #define TAILQ_INSERT_BEFORE(listelm, elm, field) do { \
410: (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \
411: (elm)->field.tqe_next = (listelm); \
412: *(listelm)->field.tqe_prev = (elm); \
413: (listelm)->field.tqe_prev = &(elm)->field.tqe_next; \
414: } while (0)
415:
416: #define TAILQ_REMOVE(head, elm, field) do { \
417: if (((elm)->field.tqe_next) != NULL) \
418: (elm)->field.tqe_next->field.tqe_prev = \
419: (elm)->field.tqe_prev; \
420: else \
421: (head)->tqh_last = (elm)->field.tqe_prev; \
422: *(elm)->field.tqe_prev = (elm)->field.tqe_next; \
423: _Q_INVALIDATE((elm)->field.tqe_prev); \
424: _Q_INVALIDATE((elm)->field.tqe_next); \
425: } while (0)
426:
427: #define TAILQ_REPLACE(head, elm, elm2, field) do { \
428: if (((elm2)->field.tqe_next = (elm)->field.tqe_next) != NULL) \
429: (elm2)->field.tqe_next->field.tqe_prev = \
430: &(elm2)->field.tqe_next; \
431: else \
432: (head)->tqh_last = &(elm2)->field.tqe_next; \
433: (elm2)->field.tqe_prev = (elm)->field.tqe_prev; \
434: *(elm2)->field.tqe_prev = (elm2); \
435: _Q_INVALIDATE((elm)->field.tqe_prev); \
436: _Q_INVALIDATE((elm)->field.tqe_next); \
437: } while (0)
438:
439: 440: 441:
442: #define CIRCLEQ_HEAD(name, type) \
443: struct name { \
444: struct type *cqh_first; \
445: struct type *cqh_last; \
446: }
447:
448: #define CIRCLEQ_HEAD_INITIALIZER(head) \
449: { CIRCLEQ_END(&head), CIRCLEQ_END(&head) }
450:
451: #define CIRCLEQ_ENTRY(type) \
452: struct { \
453: struct type *cqe_next; \
454: struct type *cqe_prev; \
455: }
456:
457: 458: 459:
460: #define CIRCLEQ_FIRST(head) ((head)->cqh_first)
461: #define CIRCLEQ_LAST(head) ((head)->cqh_last)
462: #define CIRCLEQ_END(head) ((void *)(head))
463: #define CIRCLEQ_NEXT(elm, field) ((elm)->field.cqe_next)
464: #define CIRCLEQ_PREV(elm, field) ((elm)->field.cqe_prev)
465: #define CIRCLEQ_EMPTY(head) \
466: (CIRCLEQ_FIRST(head) == CIRCLEQ_END(head))
467:
468: #define CIRCLEQ_FOREACH(var, head, field) \
469: for((var) = CIRCLEQ_FIRST(head); \
470: (var) != CIRCLEQ_END(head); \
471: (var) = CIRCLEQ_NEXT(var, field))
472:
473: #define CIRCLEQ_FOREACH_SAFE(var, head, field, tvar) \
474: for ((var) = CIRCLEQ_FIRST(head); \
475: (var) != CIRCLEQ_END(head) && \
476: ((tvar) = CIRCLEQ_NEXT(var, field), 1); \
477: (var) = (tvar))
478:
479: #define CIRCLEQ_FOREACH_REVERSE(var, head, field) \
480: for((var) = CIRCLEQ_LAST(head); \
481: (var) != CIRCLEQ_END(head); \
482: (var) = CIRCLEQ_PREV(var, field))
483:
484: #define CIRCLEQ_FOREACH_REVERSE_SAFE(var, head, headname, field, tvar) \
485: for ((var) = CIRCLEQ_LAST(head, headname); \
486: (var) != CIRCLEQ_END(head) && \
487: ((tvar) = CIRCLEQ_PREV(var, headname, field), 1); \
488: (var) = (tvar))
489:
490: 491: 492:
493: #define CIRCLEQ_INIT(head) do { \
494: (head)->cqh_first = CIRCLEQ_END(head); \
495: (head)->cqh_last = CIRCLEQ_END(head); \
496: } while (0)
497:
498: #define CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) do { \
499: (elm)->field.cqe_next = (listelm)->field.cqe_next; \
500: (elm)->field.cqe_prev = (listelm); \
501: if ((listelm)->field.cqe_next == CIRCLEQ_END(head)) \
502: (head)->cqh_last = (elm); \
503: else \
504: (listelm)->field.cqe_next->field.cqe_prev = (elm); \
505: (listelm)->field.cqe_next = (elm); \
506: } while (0)
507:
508: #define CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) do { \
509: (elm)->field.cqe_next = (listelm); \
510: (elm)->field.cqe_prev = (listelm)->field.cqe_prev; \
511: if ((listelm)->field.cqe_prev == CIRCLEQ_END(head)) \
512: (head)->cqh_first = (elm); \
513: else \
514: (listelm)->field.cqe_prev->field.cqe_next = (elm); \
515: (listelm)->field.cqe_prev = (elm); \
516: } while (0)
517:
518: #define CIRCLEQ_INSERT_HEAD(head, elm, field) do { \
519: (elm)->field.cqe_next = (head)->cqh_first; \
520: (elm)->field.cqe_prev = CIRCLEQ_END(head); \
521: if ((head)->cqh_last == CIRCLEQ_END(head)) \
522: (head)->cqh_last = (elm); \
523: else \
524: (head)->cqh_first->field.cqe_prev = (elm); \
525: (head)->cqh_first = (elm); \
526: } while (0)
527:
528: #define CIRCLEQ_INSERT_TAIL(head, elm, field) do { \
529: (elm)->field.cqe_next = CIRCLEQ_END(head); \
530: (elm)->field.cqe_prev = (head)->cqh_last; \
531: if ((head)->cqh_first == CIRCLEQ_END(head)) \
532: (head)->cqh_first = (elm); \
533: else \
534: (head)->cqh_last->field.cqe_next = (elm); \
535: (head)->cqh_last = (elm); \
536: } while (0)
537:
538: #define CIRCLEQ_REMOVE(head, elm, field) do { \
539: if ((elm)->field.cqe_next == CIRCLEQ_END(head)) \
540: (head)->cqh_last = (elm)->field.cqe_prev; \
541: else \
542: (elm)->field.cqe_next->field.cqe_prev = \
543: (elm)->field.cqe_prev; \
544: if ((elm)->field.cqe_prev == CIRCLEQ_END(head)) \
545: (head)->cqh_first = (elm)->field.cqe_next; \
546: else \
547: (elm)->field.cqe_prev->field.cqe_next = \
548: (elm)->field.cqe_next; \
549: _Q_INVALIDATE((elm)->field.cqe_prev); \
550: _Q_INVALIDATE((elm)->field.cqe_next); \
551: } while (0)
552:
553: #define CIRCLEQ_REPLACE(head, elm, elm2, field) do { \
554: if (((elm2)->field.cqe_next = (elm)->field.cqe_next) == \
555: CIRCLEQ_END(head)) \
556: (head).cqh_last = (elm2); \
557: else \
558: (elm2)->field.cqe_next->field.cqe_prev = (elm2); \
559: if (((elm2)->field.cqe_prev = (elm)->field.cqe_prev) == \
560: CIRCLEQ_END(head)) \
561: (head).cqh_first = (elm2); \
562: else \
563: (elm2)->field.cqe_prev->field.cqe_next = (elm2); \
564: _Q_INVALIDATE((elm)->field.cqe_prev); \
565: _Q_INVALIDATE((elm)->field.cqe_next); \
566: } while (0)
567:
568: #endif