我對此表示懷疑。
下面是timer_pending
代碼(timer.h#L169):
static inline int timer_pending(const struct timer_list * timer) {
return timer->entry.next != NULL;
}
及這裏的最終初始化計時器,當你調用init_timer
代碼(timer.c#L621):
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
可能會返回true。
我不知道效果可能callingn del_timer_sync
什麼對尚未初始化的計時器,雖然。
感謝。我懷疑是這樣。問題是,我想要使用模塊清理代碼來刪除定時器,但只有在它已經設置的情況下。我認爲使用該結構的「功能」成員將可能是最安全的我的測試,然後(或只是調用init_timer在模塊初始化代碼任何計時器結構,不論計時器是否會最終被使用)。 –
OK,我想我已經在我的最終答案到來:做init_timer()調用任何計時器結構* *都在模塊初始化*和*對給定結構的任何del_timer()或del_timer_sync()調用後立即以確保在稍後的任何地方,我們可能會執行timer_pending(),timer_del()或類似的操作,我們不會在堆中爆炸。 –
根據內核文檔之前,您必須*其他操作的任何* ... https://www.kernel.org/doc/htmldocs/device-drivers/API-init-timer-key.html調用init_timer – falstaff