赞
踩
#list.h源码阅读
此文章是我阅读list.h后的一些见解,有问题且理解不到位的地方希望大家批评指正。
#define LIST_HEAD_INIT(name) { &(name), &(name) }
#define LIST_HEAD(name) \
struct list_head name = LIST_HEAD_INIT(name)
其实可以写成一句
struct list_head name ={&(name),&(name)};
这个结构体在types.中定义了双向链表。
##初始化链表
static inline void INIT_LIST_HEAD(struct list_head *list)
{
WRITE_ONCE(list->next, list);
list->prev = list;
}
将双链表的头尾指向自己(初始化)。
这里有两个问题,1、inline的作用,2、WRITE_ONCE的使用。
static inline bool __list_add_valid(struct list_head *new,
struct list_head *prev,
struct list_head *next)
{
return true;
}
static inline bool __list_del_entry_valid(struct list_head *entry)
{
return true;
}
而开启DEBUG模式下的两个函数与这里的区别是无返回值,这里定义他们的类型是bool型,而bool的默认返回值为FALUSE,也就是说DEBUG模块定义了__list_add_valid,与 __list_del_entry_valid,他们的返回值为FALUSE而非DEBUG下定义了__list_add_valid与__list_del_entry_valid,他们的返回值为TRUE。我们目前只要明确这一点就好,接着往下看。
##链表插入节点
内核代码真是精妙无比,我们来看它是怎么做的。
static inline void __list_add(struct list_head *new,
struct list_head *prev,
struct list_head *next)
{
if (!__list_add_valid(new, prev, next))
return;
next-&g
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。