Linux 时钟处理机制(二)
v4.vec i; } else if ((signed long) idx < 0) { vec = base->tv1.vec (base->timer_jiffies & TVR_MASK); } else { int i; if (idx > 0xffffffffUL) { idx = 0xffffffffUL; expires = idx base->timer_jiffies; } i = (expires >> (TVR_BITS 3 * TVN_BITS)) & TVN_MASK; vec = base->tv5.vec i; } list_add_tail(&timer->entry, vec);}
代码解释: 计算该软件时钟的到期时间和 timer_jiffies (当前正在处理的软件时钟的到期时间)的差值,作为索引保存到 idx 变量中. 判断 idx 所在的区间,在 [0, ]或者( , 0)(该软件时钟已经到期),则将要添加到 tv1 中 [, ],则将要添加到 tv2 中 [, ],则将要添加到 tv3 中 [, ],则将要添加到 tv4 中 [, ),则将要添加到 tv5 中,但实际上最大值为 0xffffffffUL 计算所要加入的具体位置(哪个链表中,即 tv1~tv5 的哪个子链表,参考图3-1) 将其添加到相应的链表中 从这个函数可以得知,内核中是按照软件时钟到期时间的相对值(相对于 timer_jiffies 的值)将软件时钟添加到软件时钟所在的 base 中的. 3.3.2 删除软件时钟 内核可调用 del_timer 函数删除软件时钟, del_timer 的代码如清单3-4 清单3-4 del_timer 函数 int del_timer(struct timer_list *timer){ struct tvec_base *base; unsigned long flags; int ret = 0; …… if (timer_pending(timer)) { base = lock_timer_base(timer, &flags); if (timer_pending(timer)) { detach_timer(timer, 1); ret = 1; } spin_unlock_irqrestore(&base->lock, flags); } return ret;} 代码解释: 检测该软件时钟是否处在 pending 状态(在 base 中,准备运行),如果不是则直接函数返回 如果处于 pending 状态,则获得锁 再次检测软件时钟是否处于 pending 状态(该软件时钟可能被卸载了),不是则释放锁然后函数返回 如果还是 pending 状态,则将其卸载,之后释放锁,函数返回 如果在 SMP 系统中,则需使用 del_timer_sync 函数来删除软件时钟.在讲解 del_timer_sync 函数之前,先来看下 try_to_del_timer_sync 函数的实现(该函数被 del_timer_sync 函数使用),其代码如清单3-5 清单3-5 try_to_del_timer_sync 函数 int try_to_del_timer_sync(struct timer_list *timer){ struct tvec_base *base; unsigned long flags; int ret = -1; base = lock_timer_base(timer, &flags); if (base->running_timer == timer) goto out; ret = 0; if (timer_pending(timer)) { detach_timer(timer, 1); ret = 1; }out: spin_unlock_irqrestore(&base->lock, flags); return ret;} 该函数检测当前运行的软件时钟是不是该软件时钟,如果是,则函数返回-1,表明目前不能删除该软件时钟;如果不是检测该软件时钟是否处于 pending 状态,如果不是,则函数返回0,表明软件时钟已经被卸载,如果处于 pending 状态再把软件时钟卸载,函数返回1,表明成功卸载该软件时钟.
接下来,再来看看函数 del_timer_sync 定义,如清单3-6 清单3-6 del_timer_sync 函数 int del_timer_sync(struct timer_list *timer){ for (;;) { int ret = try_to_del_timer_sync(timer); if (ret >= 0) return ret; cpu_relax(); |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |