当前位置:网站首页>Kernel linked list (general linked list) "list.h" simple version and individual comments
Kernel linked list (general linked list) "list.h" simple version and individual comments
2022-06-30 10:35:00 【Fat Xiao Deng】
In your own installation linux Enter commands in the hostnamectl
Find kernel version 
From the kernel include/linux/ You can copy the header file list.h.
"list.h" Simple version of
#ifndef __DLIST_H
#define __DLIST_H
/* This file is from Linux Kernel (include/linux/list.h) * and modified by simply removing hardware prefetching of list items. * Here by copyright, credits attributed to wherever they belong. * Kulesh Shanmugasundaram (kulesh [squiggly] isis.poly.edu) */
/* * Simple doubly linked list implementation. * * Some of the internal functions (“__xxx”) are useful when * manipulating whole lists rather than single entries, as * sometimes we already know the next/prev entries and we can * generate better code by using them directly rather than * using the generic single-entry routines. */
/** * 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 offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
#define container_of(ptr, type, member) ({
\ const typeof( ((type *)0)->member ) *__mptr = (ptr); \ (type *)( (char *)__mptr - offsetof(type,member) );})
/* * These are non-NULL pointers that will result in page faults * under normal circumstances, used to verify that nobody uses * non-initialized list entries. */
#define LIST_POISON1 ((void *) 0x00100100)
#define LIST_POISON2 ((void *) 0x00200)
// Kernel standard linked list : Small structures
struct list_head {
struct list_head *next;
struct list_head *prev;
};
#define LIST_HEAD_INIT(name) {
&(name), &(name) }
#define LIST_HEAD(name) \ struct list_head name = LIST_HEAD_INIT(name)
// Initialize the small structure , Let itself form a two-way cycle
#define INIT_LIST_HEAD(ptr) do {
\ (ptr)->next = (ptr); (ptr)->prev = (ptr); \ } while (0)
/* * Insert a new entry between two known consecutive entries. * * This is only for internal list manipulation where we know * the prev/next entries already! */
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;
}
// middle 4 Always a pointer , The kernel turns all pointer operations of a two-way loop into functions .
// The kernel linked list has absolutely no front and back pointers , All pointer operations are encapsulated into functions
/** * list_add – add a new entry * @new: new entry to be added * @head: list head to add it after * * Insert a new entry after the specified head. * This is good for implementing stacks. */
// New nodes new Insert into to head The head of the linked list
static inline void list_add(struct list_head *new, struct list_head *head)
{
__list_add(new, head, head->next);
}
/** * 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. */
// New nodes new Insert into to head At the end of the linked list headed by
static inline void list_add_tail(struct list_head *new, struct list_head *head)
{
__list_add(new, head->prev, head);
}
/* * Delete a list entry by making the prev/next entries * point to each other. * * This is only for internal list manipulation where we know * the prev/next entries already! */
static inline void __list_del(struct list_head *prev, struct list_head *next)
{
next->prev = prev;
prev->next = next;
}
/** * list_del – deletes entry from list. * @entry: the element to delete from the list. * Note: list_empty on entry does not return true after this, the entry is in an undefined state. */
// take entry Node to , Remove from the linked list
static inline void list_del(struct list_head *entry)
{
__list_del(entry->prev, entry->next);
entry->next = (void *) 0;
entry->prev = (void *) 0;
}
/** * list_del_init – deletes entry from list and reinitialize it. * @entry: the element to delete from the list. */
static inline void list_del_init(struct list_head *entry)
{
__list_del(entry->prev, entry->next);
INIT_LIST_HEAD(entry);
}
/** * list_move – delete from one list and add as another’s head * @list: the entry to move * @head: the head that will precede our entry */
// The nodes list Move to head The head of the linked list
static inline void list_move(struct list_head *list,
struct list_head *head)
{
__list_del(list->prev, list->next);
list_add(list, head);
}
/** * list_move_tail – delete from one list and add as another’s tail * @list: the entry to move * @head: the head that will follow our entry */
// The nodes list Move to head At the end of the linked list headed by
static inline void list_move_tail(struct list_head *list,
struct list_head *head)
{
__list_del(list->prev, list->next);
list_add_tail(list, head);
}
/** * list_empty – tests whether a list is empty * @head: the list to test. */
// Judge whether the list is empty
static inline int list_empty(struct list_head *head)
{
return head->next == head;
}
static inline void __list_splice(struct list_head *list,
struct list_head *head)
{
struct list_head *first = list->next;
struct list_head *last = list->prev;
struct list_head *at = head->next;
first->prev = head;
head->next = first;
last->next = at;
at->prev = last;
}
/** * list_splice – join two lists * @list: the new list to add. * @head: the place to add it in the first list. */
// Add a new list to the original list
static inline void list_splice(struct list_head *list, struct list_head *head)
{
if (!list_empty(list))
__list_splice(list, head);
}
/** * list_splice_init – join two lists and reinitialise the emptied list. * @list: the new list to add. * @head: the place to add it in the first list. * * The list at @list is reinitialised */
static inline void list_splice_init(struct list_head *list,
struct list_head *head)
{
if (!list_empty(list)) {
__list_splice(list, head);
INIT_LIST_HEAD(list);
}
}
/** * list_entry – get the struct for this entry * @ptr: the &struct list_head pointer. * @type: the type of the struct this is embedded in. * @member: the name of the list_struct within the struct. */
// Small structure pointer ptr Convert to large structure pointer p: p = list_entry(ptr, type, member)
#define list_entry(ptr, type, member) \ ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
/** * list_for_each - iterate over a list * @pos: the &struct list_head to use as a loop counter. * @head: the head for your list. */
// Traverse the linked list from scratch ( During traversal , Nodes cannot be deleted )
#define list_for_each(pos, head) \ for (pos = (head)->next; pos != (head); \ pos = pos->next)
/** * list_for_each_prev - iterate over a list backwards * @pos: the &struct list_head to use as a loop counter. * @head: the head for your list. */
// Traverse the linked list from the end
#define list_for_each_prev(pos, head) \ for (pos = (head)->prev; pos != (head); \ pos = pos->prev)
/** * list_for_each_entry - iterate over list of given type * @pos: the type * to use as a loop counter. * @head: the head for your list. * @member: the name of the list_struct within the struct. */
// Traverse the linked list from scratch ( During traversal , Nodes can be deleted )
#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))
/** * list_for_each_safe - iterate over a list safe against removal of list entry * @pos: the &struct list_head to use as a loop counter. * @n: another &struct list_head to use as temporary storage * @head: the head for your list. */
#define list_for_each_safe(pos, n, head) \ for (pos = (head)->next, n = pos->next; pos != (head); \ pos = n, n = pos->next)
/** * list_for_each_entry_safe – iterate over list of given type safe against removal of list entry * @pos: the type * to use as a loop counter. * @n: another type * to use as temporary storage * @head: the head for your list. * @member: the name of the list_struct within the struct. */
#define list_for_each_entry_safe(pos, n, head, member) \ for (pos = list_entry((head)->next, typeof(*pos), member), \ n = list_entry(pos->member.next, typeof(*pos), member); \ &pos->member != (head); \ pos = n, n = list_entry(n->member.next, typeof(*n), member))
#endif
You can add header files in the future "list.h" Use , You can also write your own kernel linked list ( General linked list ).
边栏推荐
- Getting started with X86 - take over bare metal control
- 那个程序员,被打了。
- Questions about cookies and sessions
- Robotframework learning notes: environment installation and robotframework browser plug-in installation
- Jump table introduction
- MySQL index, transaction and storage engine of database (3)
- 转卡通学习笔记
- 技能梳理[email protected]體感機械臂
- 技能梳理[email protected]基于51系列单片机的智能仪器教具
- 安徽《合肥市装配式建筑施工图审查设计深度要求》印发;河北衡水市调整装配式建筑预售许可标准
猜你喜欢

ArcGIS Pro scripting tool (5) - delete duplicates after sorting

Chen Haotian won the national championship of the national finals of the 7th children's model star ceremony

Why can't you rob scientists of NFT

Eth is not connected to the ore pool

光明行动:共同呵护好孩子的眼睛——广西实施光明行动实地考察调研综述

长城数艺数字藏品平台发布创世徽章
[email protected]语音模块+stm32+nfc"/>技能梳理[email protected]语音模块+stm32+nfc

Action bright: take good care of children's eyes together -- a summary of the field investigation on the implementation of action bright in Guangxi

Harvester ch1 of CKB and HNS, connection tutorial analysis

“昆明城市咖啡地图”再度开启,咖啡拉近城市距离
随机推荐
六月集训(第30天) —— 拓扑排序
断路器HystrixCircuitBreaker
“昆明城市咖啡地图”活动再度开启
I found a wave of "alchemy artifact" in the goose factory. The developer should pack it quickly
Skill sorting [email protected]+ Alibaba cloud +nbiot+dht11+bh1750+ soil moisture sensor +oled
技能梳理[email protected]在oled上控制一条狗的奔跑
KOREANO ESSENTIAL打造气质职场范
Leetcode question brushing (IV) -- greedy thought (go Implementation)
Koreano essential creates a professional style
敏捷开发: 超级易用水桶估计系统
Harvester ch1 of CKB and HNS, connection tutorial analysis
Gd32 RT thread PWM drive function
前嗅ForeSpider教程:抽取数据
mysql数据库基础:TCL事务控制语言
Ant s19xp appeared in 140t, why is it called the computing power ceiling by the world
Gd32 RT thread flash driver function
GD32 RT-Thread RTC驱动函数
Notes on numerical calculation - iterative solution of linear equations
Implementation of iterative method for linear equations
Leetcode question brushing (II) -- sorting (go Implementation)