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