linux链表

删除节点

linux代码中在删除链表的节点时,会将删除的节点的prev和next指针分别指向LIST_POISON2和LIST_POISON1。这两个地址都是不可访问的地址,当访问时会发生page fault。基于此,在配置了CONFIG_DEBUG_LIST的情况下,可以利用这两个标志来判断节点的合法性。

static inline void list_del(struct list_head *entry)
{
   
	__list_del_entry(entry);
	entry->next = LIST_POISON1; //删除节点之后,置next为特定值LIST_POISON1
	entry->prev = LIST_POISON2; //删除节点之后,置prev为特定值LIST_POISON2
}

在删除节点之前,检查待删除节点的合法性

static inline void __list_del_entry(struct list_head *entry)
{
   
	if (!__list_del_entry_valid(entry))
		return;

	__list_del(entry->prev, entry->next);
}

如果没有配置CONFIG_DEBUG_LIST,合法性检查将直接返回true,即不检查。

#ifdef CONFIG_DEBUG_LIST
extern bool __list_add_valid(struct list_head *new,
			      struct list_head *prev,
			      struct list_head *next)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值