2013-11-14 183 views
0

這似乎是合理包裝調用del_timer()或del_timer_sync()的if()語句中,如:在init_timer()之前調用timer_pending()是否安全?

if (timer_pending(&t)) 
{ 
    del_timer_sync(&t); 
} 

,但我可以肯定地做到這一點的情況下,我們可能還沒有完成我們的init_timer()調用struct t?我是否需要通過籃球來完成這樣的事情?

init_timer(&t); 
t.function = foo; 
. 
. 
. 
if (t.function && timer_pending(&t)) ... 

回答

1

我對此表示懷疑。

下面是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什麼對尚未初始化的計時器,雖然。

+0

感謝。我懷疑是這樣。問題是,我想要使用模塊清理代碼來刪除定時器,但只有在它已經設置的情況下。我認爲使用該結構的「功能」成員將可能是最安全的我的測試,然後(或只是調用init_timer在模塊初始化代碼任何計時器結構,不論計時器是否會最終被使用)。 –

+0

OK,我想我已經在我的最終答案到來:做init_timer()調用任何計時器結構* *都在模塊初始化*和*對給定結構的任何del_timer()或del_timer_sync()調用後立即以確保在稍後的任何地方,我們可能會執行timer_pending(),timer_del()或類似的操作,我們不會在堆中爆炸。 –

+0

根據內核文檔之前,您必須*其他操作的任何* ... https://www.kernel.org/doc/htmldocs/device-drivers/API-init-timer-key.html調用init_timer – falstaff

0

del_timer()做timer_pending()內部檢查,你不必。

必須但是在調用del_timer之前調用了init_timer()。 (畢竟,如果你不這樣做,它只會包含垃圾)。

因此,這是不夠的:

init_timer(&t); 
del_timer(&t); 
相關問題