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;
}
内核定时机制API之del_timer
最新推荐文章于 2023-05-31 20:54:52 发布