前天看师父“浅墨”给的那段内核代码,看着看着就有点蒙了,不过在内核中实现循环链表的创建,插入,删除以及替换什么的确实很奇葩,我就只看懂了那么多代码中的一部分,下来就是我自己对这段代码的理解,可能有许多不足,欢迎大家提出。
大家都知道,一般双向循环链表的实现无非就是那几步首先会创建一个结构体,然后再实现链表的插入、删除、查找,但在内核中双向循环链表的实现却很不一样,大数据的存储就是与内核中的这些链表的实现息息相关。
struct list_head
{
struct list_head *prev;
struct list_head *next;
}
定义了一个双向的循环链表的结构。
#define LIST_HEAD_INIT(name) { &(name), &(name) }
//这个宏的作用是把参数为name 的地址赋值给结构体中的头两个变量。
#define LIST_HEAD(name) \ (这个不太理解)
struct list_head name = LIST_HEAD_INIT(name);
//定义了一个链表类的变量,变量名字命名为所给的参数,然后把链表结构赋值,相当于环起来了。
struct inline void INIT_LIST_HEAD( struct list_head *list )
{
list->next = list;
list->prev = list;
} //给定一个双链表类型的变量,使之初始化,并把它环起来。
*************************链表中元素的添加***************************
static inline void __list_add(struct list_head *new_node, struct list_head *prev, struct list_head *next)
{
next->prev = new_node;
new_node->next = next;
new_node->prev = prev;
prev->next = new_node;
} //在已知的prev和next 之间插入一个new_node 元素。
static inline void list_add(struct list_head *new_node, struct list_head *head)
{
__list_add(new_node, head, head->next);
} //在head 这个元素后面加一个new_node元素。
同理就有
static inline void list_add_tail(struct list_head *new_node, struct list_head *head)
{
__list_add(new_node, head->prev, head);
} //在head 和head->prev两个元素之间加一个元素,因为这个链是双向的,head的前一个其实就是链表的tail,所以就相当于在链表的tail添加一个元素。
***********************链表中元素的删除***************************
static inline void __list_del(struct list_head *prev, struct list_head *next)
{
next->prev = prev;
prev->next = next;
} //这个函数是一个内部函数,用来删除prev和next 之间的元素。
static inline void list_del( struct list_head *entry)
{
__list_del(entry->prev, entry->next);
entry->prev = (void *)0;
entry->next = (void *)0;
//给元素的两个指针赋值,一般都会赋一个特殊的值用来表示此结点已经被删除,但是一般不会给它赋0。
}
static inline void list_del_init(struct list_head *entry)
{
__list_del(entry->pre, entry->next);
INIT_LIST_HEAD(entry);
} //把元素从链表里删除后再给它初始化。
刚开始我感觉这个函数特别没用,既然已經删除了元素entry干嘛还要给它初始化呢?一直到想不通,最后才发现,可能与后面链表中元素替换有关系吧。看了下别人的博客,还是不太懂这块。。。
************************链表中元素的移动*****************************
static inline void list_move(struct list_head *node , struct list_head *head)
{
__list_del(node->prev, node->next);
list_add(node, head);
} //把node 这个元素删掉,然后把它加到head 这个元素的后面
static inline void list_move_tail(struct list_head *node, struct list_head *head)
{
__list_del(node->prev, node->next);
list_add_tail(node, head);
} //把node 这个元素删掉,然后把它加到head这个链表之尾。
*********************链表中元素的替换****************************
static inline void list_replace(struct list_head *old_node, struct list_head *new_node)
{
new_node->next = old_node->next;
new_node->next->prev = new_node;
new_node->prev = old_node->prev;
new_node->prev->next = new_node;
} //这里就是简单的两个元素的替换,没有什么特殊性。
static inline void list_replace_init(struct list_head *old, struct list_head *new)
{
list_replace(old, new);
INIT_LIST_HEAD(old);
} //把旧链表替换了以后,给旧链表初始化,让它成为一个新的,只有一个元素的链表。
今天就先写这么多,接下来还会有更多。。。。。。。。。。。。