Linux中通用链表(list)的解析(6)
来源:互联网 发布:关于网络的作文600字 编辑:程序博客网 时间:2024/06/03 18:38
介绍一些list的iterate over函数:
1. #define list_for_each(pos, head) /
for (pos = (head)->next; prefetch(pos->next), pos != (head); /
pos = pos->next)
关于这个遍历的循环似乎没什么好说的, 从head->next开始, 用next指针遍历, prefetch的是将指针推入CPU L1 cache的操作.
#define __list_for_each(pos, head) /
for (pos = (head)->next; pos != (head); pos = pos->next)
同上, 少了prefetch操作.
#define list_for_each_prev(pos, head) /
for (pos = (head)->prev; prefetch(pos->prev), pos != (head); /
pos = pos->prev)
这是用prev指针遍历的带prefetch的操作.
#define list_for_each_safe(pos, n, head) /
for (pos = (head)->next, n = pos->next; pos != (head); /
pos = n, n = pos->next)
安全的iterate over函数, 参数n是用于临时存储的链表.
2. #define list_for_each_entry(pos, head, member) /
for (pos = list_entry((head)->next, typeof(*pos), member); /
prefetch(pos->member.next), &pos->member != (head); /
pos = list_entry(pos->member.next, typeof(*pos), member))
这个函数中用到了前面解释过的著名的list_entry即container_of函数.
pos是一个type结构型指针, head是list头结点, member是struct中的成员.
可以看出, 这个函数是用next指针对member成员的遍历.
#define list_for_each_entry_reverse(pos, head, member) /
for (pos = list_entry((head)->prev, typeof(*pos), member); /
prefetch(pos->member.prev), &pos->member != (head); /#define list_for_each_entry_from(pos, head, member) /
for (; prefetch(pos->member.next), &pos->member != (head); /
pos = list_entry(pos->member.next, typeof(*pos), member))
pos = list_entry(pos->member.prev, typeof(*pos), member))
同上, 是用prev指针对member成员的遍历.
#define list_prepare_entry(pos, head, member) /
((pos) ? : list_entry(head, typeof(*pos), member))
获得pos指针, 用于list_for_each_entry_continuer(). 当如果pos为空时, 获得head结点的member成员入口地址.
#define list_for_each_entry_continue(pos, head, member) /
for (pos = list_entry(pos->member.next, typeof(*pos), member); /
prefetch(pos->member.next), &pos->member != (head); /
pos = list_entry(pos->member.next, typeof(*pos), member))
用next指针对member成员进行从pos开始的继续遍历.
#define list_for_each_entry_from(pos, head, member) /
for (; prefetch(pos->member.next), &pos->member != (head); /
pos = list_entry(pos->member.next, typeof(*pos), member))
用next指针对member成员进行从当前位置开始的继续遍历.
3. safe系列和rcu系统函数类似于上面的, 不再重复.
1. #define list_for_each(pos, head) /
for (pos = (head)->next; prefetch(pos->next), pos != (head); /
pos = pos->next)
关于这个遍历的循环似乎没什么好说的, 从head->next开始, 用next指针遍历, prefetch的是将指针推入CPU L1 cache的操作.
#define __list_for_each(pos, head) /
for (pos = (head)->next; pos != (head); pos = pos->next)
同上, 少了prefetch操作.
#define list_for_each_prev(pos, head) /
for (pos = (head)->prev; prefetch(pos->prev), pos != (head); /
pos = pos->prev)
这是用prev指针遍历的带prefetch的操作.
#define list_for_each_safe(pos, n, head) /
for (pos = (head)->next, n = pos->next; pos != (head); /
pos = n, n = pos->next)
安全的iterate over函数, 参数n是用于临时存储的链表.
2. #define list_for_each_entry(pos, head, member) /
for (pos = list_entry((head)->next, typeof(*pos), member); /
prefetch(pos->member.next), &pos->member != (head); /
pos = list_entry(pos->member.next, typeof(*pos), member))
这个函数中用到了前面解释过的著名的list_entry即container_of函数.
pos是一个type结构型指针, head是list头结点, member是struct中的成员.
可以看出, 这个函数是用next指针对member成员的遍历.
#define list_for_each_entry_reverse(pos, head, member) /
for (pos = list_entry((head)->prev, typeof(*pos), member); /
prefetch(pos->member.prev), &pos->member != (head); /#define list_for_each_entry_from(pos, head, member) /
for (; prefetch(pos->member.next), &pos->member != (head); /
pos = list_entry(pos->member.next, typeof(*pos), member))
pos = list_entry(pos->member.prev, typeof(*pos), member))
同上, 是用prev指针对member成员的遍历.
#define list_prepare_entry(pos, head, member) /
((pos) ? : list_entry(head, typeof(*pos), member))
获得pos指针, 用于list_for_each_entry_continuer(). 当如果pos为空时, 获得head结点的member成员入口地址.
#define list_for_each_entry_continue(pos, head, member) /
for (pos = list_entry(pos->member.next, typeof(*pos), member); /
prefetch(pos->member.next), &pos->member != (head); /
pos = list_entry(pos->member.next, typeof(*pos), member))
用next指针对member成员进行从pos开始的继续遍历.
#define list_for_each_entry_from(pos, head, member) /
for (; prefetch(pos->member.next), &pos->member != (head); /
pos = list_entry(pos->member.next, typeof(*pos), member))
用next指针对member成员进行从当前位置开始的继续遍历.
3. safe系列和rcu系统函数类似于上面的, 不再重复.
- Linux中通用链表(list)的解析(6)
- Linux中通用链表(list)的解析(1)
- Linux中通用链表(list)的解析(2)
- Linux中通用链表(list)的解析(3)
- Linux中通用链表(list)的解析(4)
- Linux中通用链表(list)的解析(5)
- Linux中通用链表(list)的解析
- linux内核学习中-- 史上最全 linux通用链表“list.h”详解
- Linux内核通用链表<linux/list.h>阅读
- Linux内核通用链表 <linux/list.h>阅读
- Linux内核中的通用链表list.h在windows下的移植实现
- linux内核部件--通用双向链表list
- linux内核部件--通用双向链表list
- linux内核中有一个通用的双向循环list链表
- Java中List转List树的通用解决方法~
- linux内核list.h中对链表的操作
- java中List对象排序的通用方法
- linux中通用GPIO接口的操作
- web service 和 remoting 有什么区别
- j2me控制音量的方法(2.0中)
- SQL部分语句及实例
- 给自己的人生忠告
- 让CSDN 博客使用Windows Live Writer
- Linux中通用链表(list)的解析(6)
- eclipse 插件集锦
- 广告控件(AdRotator)
- 图书推荐《Rich Client Programming: Plugging into the NetBeans Platform》
- VB+EXCEL 如何对EXCEL的页面设置,比如页边距等等
- DOS 下的简单登陆程序
- 迷惑的人生。
- awd BIOS rk ,'universal' tst
- 用图片来做动画