0

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

2 回答 2

1

我对此表示怀疑。

这是代码(timer.h#L169timer_pending

static inline int timer_pending(const struct timer_list * timer) {
     return timer->entry.next != NULL;
}

这是在您调用时最终初始化计时器的代码(timer.c#L621init_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_pendingentry.next您调用init_timer. 所以timer_pending当定时器没有被初始化时可能会返回true。

不过,我不知道调用del_timer_sync尚未初始化的计时器会产生什么影响。

于 2013-11-14T15:24:08.877 回答
0

del_timer () 在内部进行 timer_pending() 检查,您不必这样做。

但是,您必须在调用 del_timer 之前调用 init_timer()。(毕竟,如果你不这样做,它只会包含垃圾)。

所以这就足够了:

init_timer(&t);
del_timer(&t);
于 2013-11-14T15:36:52.730 回答