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.
} |