7.list_prepare_entry
1>function:
这个函数是如果pos非空,那么pos的值就为其本身,如果pos为空,那么就从链表头强制扩展一个虚pos指针,这个宏定义是为了在list_for_entry_continue()中使用做准备的。
2>接口:
list_prepare_entry(pos,head,member)
pos: 用于遍历的指针,只是它的数据类型是结构体类型而不是strut list_head 类型
head:链表的头指针
member:该数据项类型定义中list_head成员的变量名。
3>list_prepare_entry 实现
#define list_prepare_entry(pos, head, member) \
((pos) ? : list_entry(head, typeof(*pos), member))
如果pos非空,那么pos的值就为其本身,如果pos为空,那么就从链表头强制扩展一个虚pos指针.
8 如果遍历不是从链表头开始,而是从已知的某个结点pos开始遍历
1>Linux内核链表提供了以下函数实现从已知的某个结点pos开始遍历
list_for_each_entry_continue
list_for_each_entry_continue_reverse
list_for_each_entry_safe_continue
2>函数接口:
list_for_each_entry_continue(pos,head,member)
pos: 用于遍历的指针,只是它的数据类型是结构体类型而不是strut list_head 类型
head: 链表的头指针
member: 该数据项类型定义中list_head成员的变量名。
list_for_each_entry_continue_reverse(pos,head,member)
pos: 用于遍历的指针,只是它的数据类型是结构体类型而不是strut list_head 类型
head: 链表的头指针
member: 该数据项类型定义中list_head成员的变量名。
list_for_each_entry_safe_continue(pos,n,head,member)
pos: 用于遍历的指针,只是它的数据类型是结构体类型而不是strut list_head 类型
n: 临时指针用于占时存储pos的下一个指针
head: 链表的头指针
member: 该数据项类型定义中list_head成员的变量名
3>函数实现:
#define list_for_each_entry_continue(pos, head, member) \
for (pos = list_entry(pos->member.next, typeof(*pos), member); \
&pos->member != (head); \
pos = list_entry(pos->member.next, typeof(*pos), member))
#define list_for_each_entry_continue_reverse(pos, head, member) \
for (pos = list_entry(pos->member.prev, typeof(*pos), member); \
&pos->member != (head); \
pos = list_entry(pos->member.prev, typeof(*pos), member))
#define list_for_each_entry_safe_continue(pos, n, head, member) \
for (pos = list_entry(pos->member.next, typeof(*pos), member), \
n = list_entry(pos->member.next, typeof(*pos), member); \
&pos->member != (head); \
pos = n, n = list_entry(n->member.next, typeof(*n), member))
说明:
(1)list_for_each_entry_continue:从已知的某个结点pos后一个结点开始,进行遍历。
(2)list_for_each_entry_continue_reverse:从已知的某个结点前一个结点开始进行逆序遍历
(3)list_for_each_entry_safe_continue:从已知的某个结点pos后一个结点开始进行遍历,与list_for_each_entry_continue不同的是,它主要用于链表进行删除时进行的遍历。
(4)list_for_each_entry_continue中,传入的pos不能为NULL,必须是已经指向链表某个结点的有效指针。而在list_for_each_entry中对传入的pos无要求,可以为空。因此list_for_entry_continue常常与list_prepare_entry宏一起使用,以确保pos非空。