需要list_for_each_safe的原因
2010-12-22 17:11
686 查看
#define list_for_each(pos, head) /
for (pos = (head)->next; prefetch(pos->next), pos != (head); /
pos = pos->next)
由定义可知,list_del(pos)(将pos的前后指针指向undefined state)panic,list_del_init(pos)(将pos前后指针指向自身)导致死循环。
#define list_for_each_safe(pos, n, head) /
for (pos = (head)->next, n = pos->next; pos != (head); /
pos = n, n = pos->next)
由定义可知,safe函数首先将pos的后指针缓存到n,处理一个流程后再赋回pos,避免了这种情况的发生。
因此只遍历链表不删除节点时可以使用前者,若有删除节点的操作,则要使用后者。
由safe的说明可知,是专门为删除节点时准备的:iterate over a list safe against removal of list entry。
其他带safe的处理也基本源于这个原因。
for (pos = (head)->next; prefetch(pos->next), pos != (head); /
pos = pos->next)
由定义可知,list_del(pos)(将pos的前后指针指向undefined state)panic,list_del_init(pos)(将pos前后指针指向自身)导致死循环。
#define list_for_each_safe(pos, n, head) /
for (pos = (head)->next, n = pos->next; pos != (head); /
pos = n, n = pos->next)
由定义可知,safe函数首先将pos的后指针缓存到n,处理一个流程后再赋回pos,避免了这种情况的发生。
因此只遍历链表不删除节点时可以使用前者,若有删除节点的操作,则要使用后者。
由safe的说明可知,是专门为删除节点时准备的:iterate over a list safe against removal of list entry。
其他带safe的处理也基本源于这个原因。
相关文章推荐
- list_for_each_safe()
- list_for_each()与list_for_each_safe()的区别
- list_for_each_entry和list_for_each_entry_safe
- list_for_each_safe
- 【Linux】list_for_each()与list_for_each_safe()的区别
- list_for_each_entry list_for_each_entry_safe
- list_for_each()与list_for_each_safe()的区别
- list_for_each()与list_for_each_safe()的区别
- 遍历Linux kernel的链表时删除节点的方法 list_for_each_safe
- list_for_each()与list_for_each_safe()
- Linux内核中list_for_each_entry浅析
- 比list_entry更简洁的写法list_for_each_entry
- list_for_each_entry宏函数解析(上)
- list_for_each_entry
- linux内核学习笔记之——list_for_each_entry
- list_for_each_entry宏
- Linux内核中list_head、list_for_each、list_entry、container_of之间的关系
- list_for_each_entry
- 详解Linux内核之双向循环链表(2) list_for_each/list_entry/list_for_each_entry
- linux内核学习笔记之——list_for_each_entry