图文解释节点插入过程
##源代码
struct list_head {
struct list_head *next, *prev;
};
INIT_LIST_HEAD(&handler->h_list);
static inline void INIT_LIST_HEAD(struct list_head *list)
{
list->next = list;
list->prev = list;
}
list_add_tail(&handler->node, &input_handler_list);
/* list_add_tail - add a new entry
* @new: new entry to be added
* @head: list head to add it before
*
* Insert a new entry before the specified head.
* This is useful for implementing queues. 实现队列 */
static inline void list_add_tail(struct list_head *new, struct list_head *head)
{
__list_add(new, head->prev, head);
}
/* Insert a new entry between two known consecutive entries. 连续节点
*
* This is only for internal list manipulation where we know 内部列表操作
* the prev/next entries already! */
#ifndef CONFIG_DEBUG_LIST
static inline void __list_add(struct list_head *new,
struct list_head *prev,
struct list_head *next)
{
next->prev = new; // ①
new->next = next; // ②
new->prev = prev; // ③
prev->next = new; // ④
}
#else
extern void __list_add(struct list_head *new,
struct list_head *prev,
struct list_head *next);
#endif