Chinaunix首页 | 论坛 | 博客
  • 博客访问: 133350
  • 博文数量: 22
  • 博客积分: 854
  • 博客等级: 军士长
  • 技术积分: 415
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-08 13:44
文章存档

2013年(1)

2012年(5)

2011年(1)

2010年(5)

2009年(2)

2008年(8)

分类: LINUX

2009-11-16 11:28:09

本文档的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的处理也基本源于这个原因。
阅读(1096) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~