kernel list的分析应用

2023-09-25 18 0

kernel list的分析应用

  • 节点的定义
 struct list_head {struct list_head *next, *prev;
};
  • 初始化节点
#define LIST_HEAD_INIT(name) { &(name), &(name) }#define LIST_HEAD(name) \struct list_head name = LIST_HEAD_INIT(name)static inline void INIT_LIST_HEAD(struct list_head *list)
{list->next = list;list->prev = 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;
}static inline void list_add(struct list_head *new, struct list_head *head)
{__list_add(new, head, head->next);
}static inline void list_add_tail(struct list_head *new, struct list_head *head)
{__list_add(new, head->prev, head);
}
  • 删除节点
static inline void __list_del(struct list_head * prev, struct list_head * next)
{next->prev = prev;prev->next = next;
}static inline void list_del(struct list_head *entry)
{__list_del(entry->prev, entry->next);
}static inline void __list_del_entry(struct list_head *entry)
{__list_del(entry->prev, entry->next);
}static inline void list_del_init(struct list_head *entry)
{__list_del_entry(entry);INIT_LIST_HEAD(entry);
}
  • 替换节点
static inline void list_replace(struct list_head *old,struct list_head *new)
{new->next = old->next;new->next->prev = new;new->prev = old->prev;new->prev->next = new;
}
  • 判断双链表是否为空
static inline int list_empty(const struct list_head *head)
{return head->next == head;
}
  • 获取节点
#define list_entry(ptr, type, member) \container_of(ptr, type, member)
  • 遍历节点
#define list_for_each(pos, head) \for (pos = (head)->next; pos != (head); pos = pos->next)#define list_for_each_safe(pos, n, head) \for (pos = (head)->next, n = pos->next; pos != (head); \pos = n, n = pos->next)
struct list_head ListHead;
INIT_LIST_HEAD(&ListHead);

INIT_LIST_HEAD的定义如下:

#define INIT_LIST_HEAD(ptr) do { \(ptr)->next = (ptr); \(ptr)->prev = (ptr); \} while (0)
/*
* container_of - cast a member of a structure out to the containing structure
* @ptr:        the pointer to the member.
* @type:       the type of the container struct this is embedded in.
* @member:     the name of the member within the struct.
*
*/
#define container_of(ptr, type, member) ({                      /const typeof( ((type *)0)->member ) *__mptr = (ptr);    /(type *)( (char *)__mptr - offsetof(type,member) );}) 

list_for_each_entry的定义

/**
* list_for_each_entry     -     iterate over list of given type
* @pos:     the type * to use as a loop cursor.
* @head:     the head for your list.
* @member:     the name of the list_struct within the struct.
*/
#define list_for_each_entry(pos, head, member)                    /for (pos = list_entry((head)->next, typeof(*pos), member);     /&pos->member != (head);      /pos = list_entry(pos->member.next, typeof(*pos), member))
#include "list.h"
#include <stdio.h>typedef struct{int num;struct list_head list_node;
}id;#define offsetof(type,member) ((int) &((type *)0)->member)
static struct list_head head;
int main()
{id a, b, c;a.num = 1;b.num = 2;c.num = 3;id * ptr=NULL;INIT_LIST_HEAD(&head);list_add(&a.list_node, &head);__list_add(&b.list_node, &a.list_node, &head);__list_add(&c.list_node, &b.list_node, &head);list_for_each_entry(ptr, &head, list_node){printf("%d\n",ptr->num);}   return 0;
}

参考:
https://blog.csdn.net/u013253075/article/details/80850315
https://www.cnblogs.com/DXGG-Bond/p/13092705.html
https://www.cnblogs.com/skywang12345/p/3562146.html

代码编程
赞赏

相关文章

计算机的快速启动栏,Win7系统下将计算机分区放到快速启动栏的技巧
mac计算机图形学,如何优雅地在 Mac 上应付本科计算机图形学的 GLUT
《算法笔记》12.1小节 12.2小节——字符串专题->字符串hash进阶->KMP算法
工业测试软件对显卡要求,该如何去检测一台工控机的性能
《算法笔记》11.8小节——动态规划专题->总结
崔屹/鲍哲南,最新PNAS:锂硫电池再现“中庸之道”