搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
weixin_40725706
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
不正经测试系列(1)-Azure VM 带宽初体验_azure带宽多少
2
数据结构—八大排序_数据结构排序
3
详解ResNet(深度残差网络)
4
IANA已注册的TCP/UDP/SCTP/DCCP传输协议端口及服务名称_yhcp3165com
5
java人脸识别的考勤和监控系统(开题+源码)
6
如何用unity制作一个简易好用的第三人称摄像机跟随_unity第三人称摄像机跟随
7
鸿蒙源码分析(十三)
8
python操作本地浏览器webbrowser_import webbrowser
9
Android系统SystemUI启动过程_com.android.systemui.fe ature_cover com . android
10
快速入门Safetensors
当前位置:
article
> 正文
Linux中通用链表(list)的解析(2)_config_debug_list
作者:weixin_40725706 | 2024-02-22 02:13:40
赞
踩
config_debug_list
1. 下面介绍list的插入函数:
#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
这个函数的3个参数分别是:
new: 要插入的结点;
prev: 插入之后new的前一个结点;
next: 插入之后new的后一个结点.
下面接着的是:
#ifndef CONFIG_DEBUG_LIST
static inline void list_add(struct list_head *new, struct list_head *head)
{
__list_add(new, head, head->next);
}
#else
extern void list_add(struct list_head *new, struct list_head *head);
#endif
这是将上面的3参函数改为2参函数的调用, 表示把new插入到head后面.
同理:
static inline void list_add_tail(struct list_head *new, struct list_head *head)
{
__list_add(new, head->prev, head);
}
这表示把new插入到head前面.
接下来的:
static inline void __list_add_rcu(struct list_head * new,
struct list_head * prev, struct list_head * next)
{
new->next = next;
new->prev = prev;
smp_wmb();
next->prev = new;
prev->next = new;
}
引领的是几个rcu protected的插入函数.
2. 下面介绍list的删除函数:
static inline void __list_del(struct list_head * prev, struct list_head * next)
{
next->prev = prev;
prev->next = next;
}
通过要删除结点的前后两结点作为参数,使它们互相指向.
static inline void list_del_init(struct list_head *entry)
{
__list_del(entry->prev, entry->next);
INIT_LIST_HEAD(entry);
}
删除entry结点, 并把它的prev和next值指向安全区(即自己).
#ifndef CONFIG_DEBUG_LIST
static inline void list_del(struct list_head *entry)
{
__list_del(entry->prev, entry->next);
entry->next = LIST_POISON1;
entry->prev = LIST_POISON2;
}
#else
extern void list_del(struct list_head *entry);
#endif
通过调用上面的__list_del函数实现删除结点, 并且指定entry结点prev,next指针的值.
两个宏在linux/poison.h中定义如下:
/********** include/linux/list.h **********/
/*
* 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 *) 0x00200200)
细心的人可能发现了, 结点在被从list中删除后并没有释放, 这是因为在创建和插入结点的时候也没有申请资源, 在C/C++中的原则是哪里申请哪里释放.
rcu_del的函数同rcu_add, 不再说明.
3. 下面介绍list的替换函数:
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;
}
这个函数用new结点替换list中的old结点.
static inline void INIT_LIST_HEAD(struct list_head *list)
{
list->next = list;
list->prev = list;
}
这个函数把参数中的list结点的prev和next指向自己.
static inline void list_replace_init(struct list_head *old,
struct list_head *new)
{
list_replace(old, new);
INIT_LIST_HEAD(old);
}
这个函数是综合上面两个函数, 在用new替换old之后, 使old结点的prev和next指向安全区(即自己).
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/weixin_40725706/article/detail/128125
推荐阅读
article
【
Linux
】
_
exit
()、
exit
(
0
)、
exit
(1)与
return
区别详解
_
_
exit
(
0
)...
功能:
_
exit
() :退出程序。
exit
(
0
):运行正常退出程序;
exit
(1):运行异常退出程序;
return
...
赞
踩
article
UE4
| 异常 |
UPROPERTY
()相关_
ue4editor
-
win64
-
debug
.exe...
UE4
| 异常 |
UPROPERTY
()相关写大量主要由C++构成的的UE代码的时候需要注意类似 UTextureR...
赞
踩
article
【L
in
ux】 “xxx
is
not
in
the
sudoers
file
” 错误解决方法...
这是由于该用户在"
sudoers
"文件中不存在,解决方法就是在 etc/
sudoers
文件里给该用户添加权限步骤切换到e...
赞
踩
article
Linux
and
USB 2.0_
bulk
packets
...
This is a short writeup explaining what USB 2.0 changed
and
...
赞
踩
article
linux
内存泄漏查找_
uninitialized
-
memory
-
read
...
原文地址:http://blog.csdn.net/jinzhuojun/article/details/46659...
赞
踩
article
【Linux】
VNC
+内网穿透实现公网
远程桌面
访问
Ubuntu
_
ubuntu
vnc
...
本文主要讲解了如何在
Ubuntu
上安装
VNC
实现
远程桌面
控制,并通过cpolar内网穿透工具来实现公网远程控制,同时还介...
赞
踩
article
vue
项目中如何实现将后台接口返回
的
数据
映射成
echart
s饼形图_
从后
端传入
的
数据
list
取l...
data
的
代码假如
从后
台拿到
的
原始
数据
是
list
这种格式,我将原始
的
数据
进行一系列
的
处理,拿到我想要
的
数据
类型
的
数组ti...
赞
踩
article
Weblogic
10.3
安装与配置(
win32
and
linux
)_
win32
estimat...
Weblogic
10.3
安装与配置WebLogic
10.3
安装、配置与管理手册第一章 WebLogic
10.3
...
赞
踩
article
qc
linux
mysql
安装
教程_
linux
下
安装
mysql
...
1.现在
mysql
官网上下载了服务端和客户端两个软件:MySQL-client-community-5.1.53-1.r...
赞
踩
article
Linux
(
Ubuntu
)使用
setsid
命令
后台运行
python
代码并记录
终端
输出,并实现开机自启...
本文主要讲解:
Linux
(
Ubuntu
)使用
setsid
命令
后台运行
python
代码并记录
终端
输出,并实现开机自启set...
赞
踩
article
Linux
:使用
sed
命令替换文件内容实操及各种报错问题解决_
comm
a
nd
a
expects
\...
sed
是一种几乎可以应用在所有 UNIX 平台(包括
Linux
)上的轻量级流编辑器。
sed
有许多很好的特性。首先,...
赞
踩
article
Python文本解析之
字符
统计与词频排序_def
is
_
word
(
word
)
:
for
item
i...
一、文本
字符
统计fr = open('兰亭集序.txt','rt',encod
in
g='utf-8')fw = open...
赞
踩
article
Linux
network
namespace
(
网络
命名空间)
认知
_
linux
network
na...
整理K8s
网络
相关笔记博文内容涉及
Linux
network
namespace
认知
以及彼此
通信
Demo,实际中的应...
赞
踩
article
C#
List
按条件
获取
List
列表里的数据
_
tablemanager
.
instance
.getp...
获取
单个数据var uWork = uWorker.WorkQueue
List
.Where(p => p.WorkerI...
赞
踩
article
【
Linux
】
yum
...
yum
是一个软件下载安装的一个客户端,像小米应用商店,华为应用商城,
Linux
中软件包可能存在依赖关系,而
yum
会帮我们...
赞
踩
article
Ununtu 18.04 安装
C
a
rl
a
0.9
.
13
以及
C
a
rl
a
ros
bridge
超级避...
博主使用工作站为I912900Kf rtx3090 安装前务必有150G的空余空间
C
a
rl
a
0.9
.
13
以及
C
a
rl
a
...
赞
踩
article
Python
List
remove
()方法_
python
list
去除
nan
值...
本文转自http://www.runoob.com/
python
/att-
list
-
remove
.html侵删描述rem...
赞
踩
article
Python
list
的
remove
方法注意使用要点
_
python
list
.
remove
...
Python
中内置
list
的
remove
方法注意要点
_
python
list
.
remove
python
list
.rem...
赞
踩
article
Python
中
list
的
remove
方法
的
坑_
python
list
.
remove
的
坑...
本文首发在我
的
个人博客:https://jlice.top/p/7o05h/。欢迎大家前去参观,么么哒~在做LeetCo...
赞
踩
article
Rapid
Scada
免费
开源
Scada
组态软件系列教程7-
Linux
下系统的运行_rapidscad...
Rapid
Scada
免费
开源
Scada
组态软件系列教程系列文章目录Rapid
Scada
免费
开源
Scada
组态软件系列教程...
赞
踩
相关标签
Linux
c++
ue4
linux
ubuntu
transactions
descriptor
each
intervals
sockets
1024程序员节
VNC
cpolar
内网穿透
TCP
echarts
javascript
qc linux mysql 安装教程
运维
setsid
nohub
服务器
macos
centos