Linux系统内核定时器机制详解(下)(2)

文章作者 100test 发表时间 2007:03:14 16:44:50
来源 100Test.Com百考试题网


7.6.3.5 修改一个定时器的expires值

当一个定时器已经被插入到内核动态定时器链表中后,我们还可以修改该定时器的expires值。函数mod_timer()实现这一点。如下所示(kernel/timer.c):

int mod_timer(struct timer_list *timer, unsigned long expires) 

{ 

int ret. 

unsigned long flags. 



spin_lock_irqsave(&.timerlist_lock, flags). 

timer->expires = expires. 

ret = detach_timer(timer). 

internal_add_timer(timer). 

spin_unlock_irqrestore(&.timerlist_lock, flags). 

return ret. 

}

该函数首先根据参数expires值更新定时器的expires成员。然后调用detach_timer()函数将该定时器从它原来所属的链表中删除。最后调用internal_add_timer()函数将该定时器根据它新的expires值重新插入到相应的链表中。

函数detach_timer()首先调用timer_pending()来判断指定的定时器是否已经处于某个链表中,如果定时器原来就不处于任何链表中,则detach_timer()函数什么也不做,直接返回0值,表示失败。否则,就调用list_del()函数将定时器从它原来所处的链表中摘除。如下所示(kernel/timer.c):

static inline int detach_timer (struct timer_list *timer) 

{ 

if (!timer_pending(timer)) 

return 0. 

list_del(&.timer->list). 

return 1. 

}

7.6.3.6 删除一个定时器

函数del_timer()用来将一个定时器从相应的内核定时器队列中删除。该函数实际上是对detach_timer()函数的高层封装。如下所示(kernel/timer.c):

int del_timer(struct timer_list * timer) 

{ 

int ret. 

unsigned long flags. 



spin_lock_irqsave(&.timerlist_lock, flags). 

ret = detach_timer(timer). 

timer->list.next = timer->list.prev = NULL. 

spin_unlock_irqrestore(&.timerlist_lock, flags). 

return ret. 

}


相关文章


Linux系统内核定时器机制详解(下)(4)
Linux系统下C语言编程--进程的创建(1)
Linux系统内核定时器机制详解(下)(2)
Linux系统内核定时器机制详解(下)(3)
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛