list.h 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. /**************************************************************************
  2. *
  3. * Copyright 2006 VMware, Inc., Bismarck, ND. USA.
  4. * All Rights Reserved.
  5. *
  6. * Permission is hereby granted, free of charge, to any person obtaining a
  7. * copy of this software and associated documentation files (the
  8. * "Software"), to deal in the Software without restriction, including
  9. * without limitation the rights to use, copy, modify, merge, publish,
  10. * distribute, sub license, and/or sell copies of the Software, and to
  11. * permit persons to whom the Software is furnished to do so, subject to
  12. * the following conditions:
  13. *
  14. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16. * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
  17. * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
  18. * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
  19. * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
  20. * USE OR OTHER DEALINGS IN THE SOFTWARE.
  21. *
  22. * The above copyright notice and this permission notice (including the
  23. * next paragraph) shall be included in all copies or substantial portions
  24. * of the Software.
  25. *
  26. **************************************************************************/
  27. /**
  28. * \file
  29. * List macros heavily inspired by the Linux kernel
  30. * list handling. No list looping yet.
  31. *
  32. * Is not threadsafe, so common operations need to
  33. * be protected using an external mutex.
  34. */
  35. #ifndef _UTIL_LIST_H_
  36. #define _UTIL_LIST_H_
  37. #include <stdbool.h>
  38. #include <stddef.h>
  39. #include <assert.h>
  40. #ifdef DEBUG
  41. # define list_assert(cond, msg) assert(cond && msg)
  42. #else
  43. # define list_assert(cond, msg) (void)(0 && (cond))
  44. #endif
  45. struct list_head
  46. {
  47. struct list_head *prev;
  48. struct list_head *next;
  49. };
  50. static inline void list_inithead(struct list_head *item)
  51. {
  52. item->prev = item;
  53. item->next = item;
  54. }
  55. static inline void list_add(struct list_head *item, struct list_head *list)
  56. {
  57. item->prev = list;
  58. item->next = list->next;
  59. list->next->prev = item;
  60. list->next = item;
  61. }
  62. static inline void list_addtail(struct list_head *item, struct list_head *list)
  63. {
  64. item->next = list;
  65. item->prev = list->prev;
  66. list->prev->next = item;
  67. list->prev = item;
  68. }
  69. static inline bool list_is_empty(const struct list_head *list);
  70. static inline void list_replace(struct list_head *from, struct list_head *to)
  71. {
  72. if (list_is_empty(from)) {
  73. list_inithead(to);
  74. } else {
  75. to->prev = from->prev;
  76. to->next = from->next;
  77. from->next->prev = to;
  78. from->prev->next = to;
  79. }
  80. }
  81. static inline void list_del(struct list_head *item)
  82. {
  83. item->prev->next = item->next;
  84. item->next->prev = item->prev;
  85. item->prev = item->next = NULL;
  86. }
  87. static inline void list_delinit(struct list_head *item)
  88. {
  89. item->prev->next = item->next;
  90. item->next->prev = item->prev;
  91. item->next = item;
  92. item->prev = item;
  93. }
  94. static inline bool list_is_empty(const struct list_head *list)
  95. {
  96. return list->next == list;
  97. }
  98. /**
  99. * Returns whether the list has exactly one element.
  100. */
  101. static inline bool list_is_singular(const struct list_head *list)
  102. {
  103. return list->next != NULL && list->next != list && list->next->next == list;
  104. }
  105. static inline unsigned list_length(const struct list_head *list)
  106. {
  107. struct list_head *node;
  108. unsigned length = 0;
  109. for (node = list->next; node != list; node = node->next)
  110. length++;
  111. return length;
  112. }
  113. static inline void list_splice(struct list_head *src, struct list_head *dst)
  114. {
  115. if (list_is_empty(src))
  116. return;
  117. src->next->prev = dst;
  118. src->prev->next = dst->next;
  119. dst->next->prev = src->prev;
  120. dst->next = src->next;
  121. }
  122. static inline void list_splicetail(struct list_head *src, struct list_head *dst)
  123. {
  124. if (list_is_empty(src))
  125. return;
  126. src->prev->next = dst;
  127. src->next->prev = dst->prev;
  128. dst->prev->next = src->next;
  129. dst->prev = src->prev;
  130. }
  131. static inline void list_validate(const struct list_head *list)
  132. {
  133. struct list_head *node;
  134. assert(list->next->prev == list && list->prev->next == list);
  135. for (node = list->next; node != list; node = node->next)
  136. assert(node->next->prev == node && node->prev->next == node);
  137. }
  138. #define LIST_ENTRY(__type, __item, __field) \
  139. ((__type *)(((char *)(__item)) - offsetof(__type, __field)))
  140. /**
  141. * Cast from a pointer to a member of a struct back to the containing struct.
  142. *
  143. * 'sample' MUST be initialized, or else the result is undefined!
  144. */
  145. #ifndef container_of
  146. #define container_of(ptr, sample, member) \
  147. (void *)((char *)(ptr) \
  148. - ((char *)&(sample)->member - (char *)(sample)))
  149. #endif
  150. #define list_first_entry(ptr, type, member) \
  151. LIST_ENTRY(type, (ptr)->next, member)
  152. #define list_last_entry(ptr, type, member) \
  153. LIST_ENTRY(type, (ptr)->prev, member)
  154. #define LIST_FOR_EACH_ENTRY(pos, head, member) \
  155. for (pos = NULL, pos = container_of((head)->next, pos, member); \
  156. &pos->member != (head); \
  157. pos = container_of(pos->member.next, pos, member))
  158. #define LIST_FOR_EACH_ENTRY_SAFE(pos, storage, head, member) \
  159. for (pos = NULL, pos = container_of((head)->next, pos, member), \
  160. storage = container_of(pos->member.next, pos, member); \
  161. &pos->member != (head); \
  162. pos = storage, storage = container_of(storage->member.next, storage, member))
  163. #define LIST_FOR_EACH_ENTRY_SAFE_REV(pos, storage, head, member) \
  164. for (pos = NULL, pos = container_of((head)->prev, pos, member), \
  165. storage = container_of(pos->member.prev, pos, member); \
  166. &pos->member != (head); \
  167. pos = storage, storage = container_of(storage->member.prev, storage, member))
  168. #define LIST_FOR_EACH_ENTRY_FROM(pos, start, head, member) \
  169. for (pos = NULL, pos = container_of((start), pos, member); \
  170. &pos->member != (head); \
  171. pos = container_of(pos->member.next, pos, member))
  172. #define LIST_FOR_EACH_ENTRY_FROM_REV(pos, start, head, member) \
  173. for (pos = NULL, pos = container_of((start), pos, member); \
  174. &pos->member != (head); \
  175. pos = container_of(pos->member.prev, pos, member))
  176. #define list_for_each_entry(type, pos, head, member) \
  177. for (type *pos = LIST_ENTRY(type, (head)->next, member), \
  178. *__next = LIST_ENTRY(type, pos->member.next, member); \
  179. &pos->member != (head); \
  180. pos = LIST_ENTRY(type, pos->member.next, member), \
  181. list_assert(pos == __next, "use _safe iterator"), \
  182. __next = LIST_ENTRY(type, __next->member.next, member))
  183. #define list_for_each_entry_safe(type, pos, head, member) \
  184. for (type *pos = LIST_ENTRY(type, (head)->next, member), \
  185. *__next = LIST_ENTRY(type, pos->member.next, member); \
  186. &pos->member != (head); \
  187. pos = __next, \
  188. __next = LIST_ENTRY(type, __next->member.next, member))
  189. #define list_for_each_entry_rev(type, pos, head, member) \
  190. for (type *pos = LIST_ENTRY(type, (head)->prev, member), \
  191. *__prev = LIST_ENTRY(type, pos->member.prev, member); \
  192. &pos->member != (head); \
  193. pos = LIST_ENTRY(type, pos->member.prev, member), \
  194. list_assert(pos == __prev, "use _safe iterator"), \
  195. __prev = LIST_ENTRY(type, __prev->member.prev, member))
  196. #define list_for_each_entry_safe_rev(type, pos, head, member) \
  197. for (type *pos = LIST_ENTRY(type, (head)->prev, member), \
  198. *__prev = LIST_ENTRY(type, pos->member.prev, member); \
  199. &pos->member != (head); \
  200. pos = __prev, \
  201. __prev = LIST_ENTRY(type, __prev->member.prev, member))
  202. #define list_for_each_entry_from(type, pos, start, head, member) \
  203. for (type *pos = LIST_ENTRY(type, (start), member); \
  204. &pos->member != (head); \
  205. pos = LIST_ENTRY(type, pos->member.next, member))
  206. #define list_for_each_entry_from_safe(type, pos, start, head, member) \
  207. for (type *pos = LIST_ENTRY(type, (start), member), \
  208. *__next = LIST_ENTRY(type, pos->member.next, member); \
  209. &pos->member != (head); \
  210. pos = __next, \
  211. __next = LIST_ENTRY(type, __next->member.next, member))
  212. #define list_for_each_entry_from_rev(type, pos, start, head, member) \
  213. for (type *pos = LIST_ENTRY(type, (start), member); \
  214. &pos->member != (head); \
  215. pos = LIST_ENTRY(type, pos->member.prev, member))
  216. #define list_pair_for_each_entry(type, pos1, pos2, head1, head2, member) \
  217. for (type *pos1 = LIST_ENTRY(type, (head1)->next, member), \
  218. *pos2 = LIST_ENTRY(type, (head2)->next, member); \
  219. &pos1->member != (head1) && &pos2->member != (head2); \
  220. pos1 = LIST_ENTRY(type, pos1->member.next, member), \
  221. pos2 = LIST_ENTRY(type, pos2->member.next, member))
  222. #endif /*_UTIL_LIST_H_*/