在init_timer()之前调用timer_pending()是否安全?

时间:2013-11-14 15:16:14

标签: c linux timer module kernel

在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)) ...

2 个答案:

答案 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);