内核定时机制API之del_timer

int del_timer(struct timer_list *timer) 用于删除一个timer。一般和add_timer 配合使用.
其源码分析如下:
int del_timer(struct timer_list *timer)
{
	struct timer_base *base;
	unsigned long flags;
	int ret = 0;

	debug_assert_init(timer);
	#可以看到如果timer 没有pending,就说明这个timer已经执行完了,就啥也不
	if (timer_pending(timer)) {
		#得到这个timer的base
		base = lock_timer_base(timer, &flags);
		#开始删除这个timer
		ret = detach_if_pending(timer, base, true);
		raw_spin_unlock_irqrestore(&base->lock, flags);
	}

	return ret;
}

static int detach_if_pending(struct timer_list *timer, struct timer_base *base,
			     bool clear_pending)
{
	#根据timer得到这个timer在base中的index
	unsigned idx = timer_get_idx(timer);
	#再次检查这个timer是否base,因为我们在操作的时候timer一直在走
	if (!timer_pending(timer))
		return 0;
	#清除timer在base->pending_map 的index
	if (hlist_is_singular_node(&timer->entry, base->vectors + idx))
		__clear_bit(idx, base->pending_map);
	#从list中删除这个timer
	detach_timer(timer, clear_pending);
	return 1;
}
static inline void detach_timer(struct timer_list *timer, bool clear_pending)
{
	struct hlist_node *entry = &timer->entry;

	debug_deactivate(timer);
	#删除这个timer
	__hlist_del(entry);
	#从前面的code可以看到,由于timer pending 才能走到这一步,因此这里要清掉pending 标志
	if (clear_pending)
		entry->pprev = NULL;
	entry->next = LIST_POISON2;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值