list.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357
  1. #pragma once
  2. #include <common/stddef.h>
  3. #if ARCH(I386) || ARCH(X86_64)
  4. #include <arch/x86_64/asm.h>
  5. #else
  6. #error Arch not supported.
  7. #endif
  8. //链表数据结构
  9. struct List
  10. {
  11. struct List *prev, *next;
  12. };
  13. //初始化循环链表
  14. static inline void list_init(struct List *list)
  15. {
  16. list->next = list;
  17. io_mfence();
  18. list->prev = list;
  19. }
  20. /**
  21. * @brief
  22. * @param entry 给定的节点
  23. * @param node 待插入的节点
  24. **/
  25. static inline void list_add(struct List *entry, struct List *node)
  26. {
  27. node->next = entry->next;
  28. barrier();
  29. node->prev = entry;
  30. barrier();
  31. node->next->prev = node;
  32. barrier();
  33. entry->next = node;
  34. }
  35. /**
  36. * @brief 将node添加到给定的list的结尾(也就是当前节点的前面)
  37. * @param entry 列表的入口
  38. * @param node 待添加的节点
  39. */
  40. static inline void list_append(struct List *entry, struct List *node)
  41. {
  42. struct List *tail = entry->prev;
  43. list_add(tail, node);
  44. }
  45. /**
  46. * @brief 从列表中删除节点
  47. * @param entry 待删除的节点
  48. */
  49. static inline void list_del(struct List *entry)
  50. {
  51. entry->next->prev = entry->prev;
  52. entry->prev->next = entry->next;
  53. }
  54. /**
  55. * @brief 删除链表的结点,并将这个结点重新初始化
  56. *
  57. */
  58. #define list_del_init(entry) \
  59. list_del(entry); \
  60. list_init(entry);
  61. /**
  62. * @brief 将新的链表结点替换掉旧的链表结点,并使得旧的结点的前后指针均为NULL
  63. *
  64. * @param old 要被替换的结点
  65. * @param new 新的要换上去的结点
  66. */
  67. static inline void list_replace(struct List *old, struct List *new)
  68. {
  69. if (old->prev != NULL)
  70. old->prev->next = new;
  71. new->prev = old->prev;
  72. if (old->next != NULL)
  73. old->next->prev = new;
  74. new->next = old->next;
  75. old->prev = NULL;
  76. old->next = NULL;
  77. }
  78. static inline bool list_empty(struct List *entry)
  79. {
  80. /**
  81. * @brief 判断循环链表是否为空
  82. * @param entry 入口
  83. */
  84. if (entry == entry->next && entry->prev == entry)
  85. return true;
  86. else
  87. return false;
  88. }
  89. /**
  90. * @brief 获取链表的上一个元素
  91. *
  92. * @param entry
  93. * @return 链表的上一个元素
  94. */
  95. static inline struct List *list_prev(struct List *entry)
  96. {
  97. if (entry->prev != NULL)
  98. return entry->prev;
  99. else
  100. return NULL;
  101. }
  102. /**
  103. * @brief 获取链表的下一个元素
  104. *
  105. * @param entry
  106. * @return 链表的下一个元素
  107. */
  108. static inline struct List *list_next(struct List *entry)
  109. {
  110. if (entry->next != NULL)
  111. return entry->next;
  112. else
  113. return NULL;
  114. }
  115. /**
  116. * @brief 获取当前entry的链表结构体
  117. *
  118. * @param ptr 指向List结构体的指针
  119. * @param type 包裹着List结构体的外层结构体的类型
  120. * @param member List结构体在上述的“包裹list结构体的结构体”中的变量名
  121. */
  122. #define list_entry(ptr, type, member) container_of(ptr, type, member)
  123. /**
  124. * @brief 获取链表中的第一个元素
  125. * 请注意,该宏要求链表非空,否则会出错
  126. *
  127. * @param ptr 指向链表头的指针
  128. * @param type 包裹着List结构体的外层结构体的类型
  129. * @param member List结构体在上述的“包裹list结构体的结构体”中的变量名
  130. */
  131. #define list_first_entry(ptr, type, member) list_entry((ptr)->next, type, member)
  132. /**
  133. * @brief 获取链表中的第一个元素
  134. * 若链表为空,则返回NULL
  135. *
  136. * @param ptr 指向链表头的指针
  137. * @param type 包裹着List结构体的外层结构体的类型
  138. * @param member List结构体在上述的“包裹list结构体的结构体”中的变量名
  139. */
  140. #define list_first_entry_or_null(ptr, type, member) (!list_empty(ptr) ? list_entry((ptr)->next, type, member) : NULL)
  141. /**
  142. * @brief 获取链表中的最后一个元素
  143. * 请注意,该宏要求链表非空,否则会出错
  144. *
  145. * @param ptr 指向链表头的指针
  146. * @param type 包裹着List结构体的外层结构体的类型
  147. * @param member List结构体在上述的“包裹list结构体的结构体”中的变量名
  148. */
  149. #define list_last_entry(ptr, type, member) list_entry((ptr)->prev, type, member)
  150. /**
  151. * @brief 获取链表中的最后一个元素
  152. * 若链表为空,则返回NULL
  153. *
  154. * @param ptr 指向链表头的指针
  155. * @param type 包裹着List结构体的外层结构体的类型
  156. * @param member List结构体在上述的“包裹list结构体的结构体”中的变量名
  157. */
  158. #define list_last_entry_or_full(ptr, type, member) (!list_empty(ptr) ? list_entry((ptr)->prev, type, member) : NULL)
  159. /**
  160. * @brief 获取链表中的下一个元素
  161. *
  162. * @param pos 指向当前的外层结构体的指针
  163. * @param member 链表结构体在外层结构体内的变量名
  164. */
  165. #define list_next_entry(pos, member) list_entry((pos)->member.next, typeof(*(pos)), member)
  166. /**
  167. * @brief 获取链表中的上一个元素
  168. *
  169. * @param pos 指向当前的外层结构体的指针
  170. * @param member 链表结构体在外层结构体内的变量名
  171. */
  172. #define list_prev_entry(pos, member) list_entry((pos)->member.prev, typeof(*(pos)), member)
  173. /**
  174. * @brief 遍历整个链表(从前往后)
  175. *
  176. * @param ptr the &struct list_head to use as a loop cursor.
  177. * @param head the head for your list.
  178. */
  179. #define list_for_each(ptr, head) \
  180. for ((ptr) = (head)->next; (ptr) != (head); (ptr) = (ptr)->next)
  181. /**
  182. * @brief 遍历整个链表(从后往前)
  183. *
  184. * @param ptr the &struct list_head to use as a loop cursor.
  185. * @param head the head for your list.
  186. */
  187. #define list_for_each_prev(ptr, head) \
  188. for ((ptr) = (head)->prev; (ptr) != (head); (ptr) = (ptr)->prev)
  189. /**
  190. * @brief 遍历整个链表(从前往后)(支持删除当前链表结点)
  191. * 该宏通过暂存中间变量,防止在迭代链表的过程中,由于删除了当前ptr所指向的链表结点从而造成错误
  192. *
  193. * @param ptr the &struct list_head to use as a loop cursor.
  194. * @param n 用于存储临时值的List类型的指针
  195. * @param head the head for your list.
  196. */
  197. #define list_for_each_safe(ptr, n, head) \
  198. for ((ptr) = (head)->next, (n) = (ptr)->next; (ptr) != (head); (ptr) = n, n = (ptr)->next)
  199. /**
  200. * @brief 遍历整个链表(从前往后)(支持删除当前链表结点)
  201. * 该宏通过暂存中间变量,防止在迭代链表的过程中,由于删除了当前ptr所指向的链表结点从而造成错误
  202. *
  203. * @param ptr the &struct list_head to use as a loop cursor.
  204. * @param n 用于存储临时值的List类型的指针
  205. * @param head the head for your list.
  206. */
  207. #define list_for_each_prev_safe(ptr, n, head) \
  208. for ((ptr) = (head)->prev, (n) = (ptr)->prev; (ptr) != (head); (ptr) = n, n = (ptr)->prev)
  209. /**
  210. * @brief 从头开始迭代给定类型的链表
  211. *
  212. * @param pos 指向特定类型的结构体的指针
  213. * @param head 链表头
  214. * @param member struct List在pos的结构体中的成员变量名
  215. */
  216. #define list_for_each_entry(pos, head, member) \
  217. for (pos = list_first_entry(head, typeof(*pos), member); \
  218. &pos->member != (head); \
  219. pos = list_next_entry(pos, member))
  220. /**
  221. * @brief 从头开始迭代给定类型的链表(支持删除当前链表结点)
  222. *
  223. * @param pos 指向特定类型的结构体的指针
  224. * @param n 用于存储临时值的,和pos相同类型的指针
  225. * @param head 链表头
  226. * @param member struct List在pos的结构体中的成员变量名
  227. */
  228. #define list_for_each_entry_safe(pos, n, head, member) \
  229. for (pos = list_first_entry(head, typeof(*pos), member), n = list_next_entry(pos, member); \
  230. &pos->member != (head); \
  231. pos = n, n = list_next_entry(n, member))
  232. /**
  233. * @brief 逆序迭代给定类型的链表
  234. *
  235. * @param pos 指向特定类型的结构体的指针
  236. * @param head 链表头
  237. * @param member struct List在pos的结构体中的成员变量名
  238. */
  239. #define list_for_each_entry_reverse(pos, head, member) \
  240. for (pos = list_last_entry(head, typeof(*pos), member); \
  241. &pos->member != (head); \
  242. pos = list_prev_entry(pos, member))
  243. /**
  244. * @brief 为list_for_each_entry_continue()准备一个'pos'结构体
  245. *
  246. * @param pos 指向特定类型的结构体的,用作迭代起点的指针
  247. * @param head 指向要开始迭代的struct List结构体的指针
  248. * @param member struct List在pos的结构体中的成员变量名
  249. */
  250. #define list_prepare_entry(pos, head, member) \
  251. ((pos) ? pos : list_entry(head, typeof(*pos), member))
  252. /**
  253. * @brief 从指定的位置的[下一个元素开始],继续迭代给定的链表
  254. *
  255. * @param pos 指向特定类型的结构体的指针。该指针用作迭代的指针。
  256. * @param head 指向链表头的struct List的指针
  257. * @param member struct List在pos指向的结构体中的成员变量名
  258. */
  259. #define list_for_each_entry_continue(pos, head, member) \
  260. for (pos = list_next_entry(pos, member); \
  261. &pos->member != (head); \
  262. pos = list_next_entry(pos, member))
  263. /**
  264. * @brief 从指定的位置的[下一个元素开始],继续迭代给定的链表。(支持删除当前链表结点)
  265. *
  266. * @param pos 指向特定类型的结构体的指针。该指针用作迭代的指针。
  267. * @param n 用于存储临时值的,和pos相同类型的指针
  268. * @param head 指向链表头的struct List的指针
  269. * @param member struct List在pos指向的结构体中的成员变量名
  270. */
  271. #define list_for_each_entry_safe_continue(pos, n, head, member) \
  272. for (pos = list_next_entry(pos, member), n = list_next_entry(pos, member); \
  273. &pos->member != (head); \
  274. pos = n, n = list_next_entry(n, member))
  275. /**
  276. * @brief 从指定的位置的[上一个元素开始],【逆序】迭代给定的链表
  277. *
  278. * @param pos 指向特定类型的结构体的指针。该指针用作迭代的指针。
  279. * @param head 指向链表头的struct List的指针
  280. * @param member struct List在pos指向的结构体中的成员变量名
  281. */
  282. #define list_for_each_entry_continue_reverse(pos, head, member) \
  283. for (pos = list_prev_entry(pos, member); \
  284. &pos->member != (head); \
  285. pos = list_prev_entry(pos, member))
  286. /**
  287. * @brief 从指定的位置的[上一个元素开始],【逆序】迭代给定的链表。(支持删除当前链表结点)
  288. *
  289. * @param pos 指向特定类型的结构体的指针。该指针用作迭代的指针。
  290. * @param head 指向链表头的struct List的指针
  291. * @param member struct List在pos指向的结构体中的成员变量名
  292. */
  293. #define list_for_each_entry_safe_continue_reverse(pos, n, head, member) \
  294. for (pos = list_prev_entry(pos, member), n = list_prev_entry(pos, member); \
  295. &pos->member != (head); \
  296. pos = n, n = list_prev_entry(n, member))
  297. /**
  298. * @brief 从指定的位置开始,继续迭代给定的链表
  299. *
  300. * @param pos 指向特定类型的结构体的指针。该指针用作迭代的指针。
  301. * @param head 指向链表头的struct List的指针
  302. * @param member struct List在pos指向的结构体中的成员变量名
  303. */
  304. #define list_for_each_entry_from(pos, head, member) \
  305. for (; \
  306. &pos->member != (head); \
  307. pos = list_next_entry(pos, member))
  308. /**
  309. * @brief 从指定的位置开始,继续迭代给定的链表.(支持删除当前链表结点)
  310. *
  311. * @param pos 指向特定类型的结构体的指针。该指针用作迭代的指针。
  312. * @param n 用于存储临时值的,和pos相同类型的指针
  313. * @param head 指向链表头的struct List的指针
  314. * @param member struct List在pos指向的结构体中的成员变量名
  315. */
  316. #define list_for_each_entry_safe_from(pos, n, head, member) \
  317. for (n = list_next_entry(pos, member); \
  318. &pos->member != (head); \
  319. pos = n, n = list_next_entry(n, member))