list.h 12 KB

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