本文档的Copyleft归skyfeces所有, 使用GPL发布, 可以自由拷贝, 转载, 转载时请保持文档的完整性, 严禁用于任何商业用途。
msn:
skyfeces@139.com
来源:
http://fordme.cublog.cn
以list_for_each()与list_for_each_safe()为例。
#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的处理也基本源于这个原因。
阅读(1309) | 评论(0) | 转发(1) |