queue.h 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. #pragma once
  2. /* Implementation from BSD headers*/
  3. #define QMD_SAVELINK(name, link) void **name = (void *)&(link)
  4. #define TRASHIT(x) do {(x) = (void *)-1;} while (0)
  5. #define STAILQ_NEXT(elm, field) ((elm)->field.stqe_next)
  6. #define STAILQ_FIRST(head) ((head)->stqh_first)
  7. #define STAILQ_HEAD(name, type) \
  8. struct name { \
  9. struct type *stqh_first;/* first element */ \
  10. struct type **stqh_last;/* addr of last next element */ \
  11. }
  12. #define STAILQ_ENTRY(type) \
  13. struct { \
  14. struct type *stqe_next; /* next element */ \
  15. }
  16. #define STAILQ_INSERT_TAIL(head, elm, field) do { \
  17. STAILQ_NEXT((elm), field) = NULL; \
  18. *(head)->stqh_last = (elm); \
  19. (head)->stqh_last = &STAILQ_NEXT((elm), field); \
  20. } while (0)
  21. #define STAILQ_INIT(head) do { \
  22. STAILQ_FIRST((head)) = NULL; \
  23. (head)->stqh_last = &STAILQ_FIRST((head)); \
  24. } while (0)
  25. #define STAILQ_FOREACH(var, head, field) \
  26. for((var) = STAILQ_FIRST((head)); \
  27. (var); \
  28. (var) = STAILQ_NEXT((var), field))
  29. #define STAILQ_FOREACH_SAFE(var, head, field, tvar) \
  30. for ((var) = STAILQ_FIRST((head)); \
  31. (var) && ((tvar) = STAILQ_NEXT((var), field), 1); \
  32. (var) = (tvar))
  33. #define STAILQ_REMOVE_AFTER(head, elm, field) do { \
  34. if ((STAILQ_NEXT(elm, field) = \
  35. STAILQ_NEXT(STAILQ_NEXT(elm, field), field)) == NULL) \
  36. (head)->stqh_last = &STAILQ_NEXT((elm), field); \
  37. } while (0)
  38. #define STAILQ_REMOVE_HEAD(head, field) do { \
  39. if ((STAILQ_FIRST((head)) = \
  40. STAILQ_NEXT(STAILQ_FIRST((head)), field)) == NULL) \
  41. (head)->stqh_last = &STAILQ_FIRST((head)); \
  42. } while (0)
  43. #define STAILQ_REMOVE(head, elm, type, field) do { \
  44. QMD_SAVELINK(oldnext, (elm)->field.stqe_next); \
  45. if (STAILQ_FIRST((head)) == (elm)) { \
  46. STAILQ_REMOVE_HEAD((head), field); \
  47. } \
  48. else { \
  49. struct type *curelm = STAILQ_FIRST((head)); \
  50. while (STAILQ_NEXT(curelm, field) != (elm)) \
  51. curelm = STAILQ_NEXT(curelm, field); \
  52. STAILQ_REMOVE_AFTER(head, curelm, field); \
  53. } \
  54. TRASHIT(*oldnext); \
  55. } while (0)