你好,游客 登录 注册 搜索
背景:
阅读新闻

Linux内核链表的研究与应用

[日期:2013-01-17] 来源:CSDN  作者:tigerjb [字体: ]

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非空。

linux
相关资讯       Linux内核链表  内核链表  Linux链表 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款