科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道Linux系统内核定时器机制详解(下) (2)

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

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

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

作者:赛迪网技术社区 来源:赛迪网技术社区 2007年10月24日

关键字: 机制 定时器 内核 Linux

  • 评论
  • 分享微博
  • 分享邮件

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; 
}
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章