2013-11-14 2 views
0

이 (del_timer를 호출을 래핑하는 현명한 것 같다) 또는 같은 경우() 문 내에서 del_timer_sync() :init_timer() 전에 timer_pending()을 호출해도 안전합니까?

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

는하지만 안전하게 할 수있는 경우에 우리는 아직 끝나지 않았을 수 있습니다 곳 구조체 t에 대한 init_timer() 호출? 이런 식으로 농구를 뛰어 넘어야합니까?

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)입니다 : timer_pending이 확인되는

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); 
} 

init_timer에 전화 할 때까지 초기화되지 않은 entry.next입니다. 따라서 타이머가 초기화되지 않은 경우 timer_pending이 true를 반환 할 수 있습니다.

어떤 효과가 초기화되지 않은 타이머에서 del_timer_sync을 호출 할 수 있는지 알 수 없습니다.

+0

감사합니다. 나는 이것이 사실이라고 의심했다. 문제는 타이머를 제거하는 모듈 정리 코드를 원한다는 것입니다. 나는 구조체의 'function'멤버를 사용하여 아마도 가장 안전한 테스트가 될 것이라고 생각한다. (또는 타이머가 사용되는지 여부에 관계없이 모듈 init 코드의 모든 타이머 구조체에 대해 init_timer를 호출한다.) –

+0

좋아요, 내 마지막 답변에 도달했다고 생각합니다 : 모든 타이머에 대한 init_timer() 호출은 * init * 및 * 구조체에서 * struct *를 호출하여 모든 del_timer() 또는 del_timer_sync() 나중에 우리가 timer_pending(), timer_del() 또는 유사한 것을 할 수있는 곳이면, 우리는 힙에서 폭발하지 않을 것입니다. –

+0

커널 문서에 따르면 다른 작업 중 * any * 앞에 init_timer를 호출해야합니다. https://www.kernel.org/doc/htmldocs/device-drivers/API-init-timer-key.html – falstaff

0

del_timer() 내부적으로 timer_pending() 확인을 수행 할 필요가 없습니다.

그러나 이어야하며 del_timer를 호출하기 전에 init_timer()를 호출해야합니다. (결국, 당신이하지 않으면 그냥 쓰레기가 포함됩니다).

그래서이 충분하다 :

init_timer(&t); 
del_timer(&t); 
관련 문제