(五)hlist的搬移操作
还记得
list_move(struct list_head *list, struct list_head *head)吗?
这个表示将list从一个链表当中删除之后,加入到一新的链表head当中。
在hlist中的搬移指的是,将new指向old所指向的那个链表。搬移之后,如果new的第一个元素不为空,则修改它的pprev值。
-
static inline void hlist_move_list(struct hlist_head *old,
-
struct hlist_head *new)
-
{
-
new->first = old->first;
-
if (new->first)
-
new->first->pprev = &new->first;
-
old->first = NULL;
-
}
(六)hlist的宏遍历
关于hlist遍历的宏总共有7个,下面我们一一来分析:
1)
ptr:表示struct hlist_node类型的一个地址。
type:结构体名
member:type结构体中的hlist_node成员变量的名称
这个宏在list链表中分析过了,表示得到ptr所指地址的这个结构体的首地址
#define hlist_entry(ptr, type, member) container_of(ptr,type,member)
2)
pos:struct hlist_node类型的一个指针;
head:struct hlist_head类型的一个指针,表示hlist链表的头结点。
这个实际上就是一个for循环,从头到尾遍历链表。
-
#define hlist_for_each(pos, head) \
-
for (pos = (head)->first; pos && ({ prefetch(pos->next); 1; }); \
-
pos = pos->next)
3)
这个实际上就是一个for循环,从头到尾遍历链表。这个和前面的不同的是多了一个n,这么做是为了遍历过程中防止断链的发生。
pos:struct hlist_node类型的一个指针;
n:struct hlist_node类型的一个指针;
head:struct hlist_head类型的一个指针,表示hlist链表的头结点。
-
#define hlist_for_each_safe(pos, n, head) \
-
for (pos = (head)->first; pos && ({ n = pos->next; 1; }); \
-
pos = n)
4)
tops:用来存放遍历到的数据结构的地址,类型是type *;
pos:struct hlist_node类型的一个指针;
head:hlist链表的头结点;
member:struct hlist_node在type结构体中的变量的名称。
在循环中,我们就可以使用tops来指向type类型结构体的任何一个变量了。
-
#define hlist_for_each_entry(tpos, pos, head, member) \
-
for (pos = (head)->first; \
-
pos && ({ prefetch(pos->next); 1;}) && \
-
({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \
-
pos = pos->next)
5)
tops:用来存放遍历到的数据结构的地址,类型是type *;
pos:struct hlist_node类型的一个指针;
member:struct hlist_node在type结构体中的变量的名称。
这个宏是从pos这个地址的下一个元素处开始继续往下遍历。
-
#define hlist_for_each_entry_continue(tpos, pos, member) \
-
for (pos = (pos)->next; \
-
pos && ({ prefetch(pos->next); 1;}) && \
-
({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \
-
pos = pos->next)
6)
tops:用来存放遍历到的数据结构的地址,类型是type *;
pos:struct hlist_node类型的一个指针;
member:struct hlist_node在type结构体中的变量的名称。
这个宏是从pos这个地址处开始继续往下遍历。
-
#define hlist_for_each_entry_from(tpos, pos, member) \
-
for (; pos && ({ prefetch(pos->next); 1;}) && \
-
({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \
-
pos = pos->next)
注:(5)和(6)的区别就是一个是从pos的下一个开始,而(6)是pos开始。
7)
tops:用来存放遍历到的数据结构的地址,类型是type *;
pos:struct hlist_node类型的一个指针;
n:struct hlist_node类型的一个指针;
head:hlist链表的头结点;
member:struct hlist_node在type结构体中的变量的名称。
在循环中,我们就可以使用tops来指向type类型结构体的任何一个变量了。这个宏函数也是为了防止在遍历的时候删除节点而引入的。
-
#define hlist_for_each_entry_safe(tpos, pos, n, head, member) \
-
for (pos = (head)->first; \
-
pos && ({ n = pos->next; 1; }) && \
-
({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \
-
pos = n)