在if()语句中包含对del_timer()或del_timer_sync()的调用似乎是明智的,例如:
if (timer_pending(&t))
{
del_timer_sync(&t);
}
但在我们可能尚未对struct t进行init_timer()调用的情况下,我能安全地执行此操作吗?我是否需要通过这样的事情跳过篮球呢?
init_timer(&t);
t.function = foo;
.
.
.
if (t.function && timer_pending(&t)) ...
答案 0 :(得分:1)
我对此表示怀疑。
以下是timer_pending
的代码(timer.h#L169):
static inline int timer_pending(const struct timer_list * timer) {
return timer->entry.next != NULL;
}
这是代码(timer.c#L621),当您致电init_timer
时,该代码最终会初始化定时器:
static void do_init_timer(struct timer_list *timer, unsigned int flags,
const char *name, struct lock_class_key *key)
{
struct tvec_base *base = __raw_get_cpu_var(tvec_bases);
timer->entry.next = NULL;
timer->base = (void *)((unsigned long)base | flags);
timer->slack = -1;
#ifdef CONFIG_TIMER_STATS
timer->start_site = NULL;
timer->start_pid = -1;
memset(timer->start_comm, 0, TASK_COMM_LEN);
#endif
lockdep_init_map(&timer->lockdep_map, name, key, 0);
}
请注意,timer_pending
正在检查entry.next
,在您致电init_timer
之前,该timer_pending
尚未初始化。因此,当计时器尚未初始化时,del_timer_sync
可能会返回true。
我不知道在一个尚未初始化的计时器上调用{{1}}会产生什么影响。
答案 1 :(得分:0)
del_timer()在内部执行timer_pending()检查,您不需要。
你必须但是在调用del_timer之前调用了init_timer()。 (毕竟,如果你不这样做,它只会包含垃圾)。
所以这就足够了:
init_timer(&t);
del_timer(&t);