QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1001|回复: 1

我在看Linux源代码关于定时器的部分时感觉跟我的理解有出入

[复制链接]
发表于 2004-1-16 20:47:21 | 显示全部楼层 |阅读模式
我在看Linux源代码关于定时器的部分时感觉跟我的理解有出入,特地在此请教大家
/* The following codes are in the /kernel/timer.c       */
static inline void internal_add_timer(struct timer_list *timer)
{
        /*
         * must be cli-ed when calling this
         */
        unsigned long expires = timer->expires;
        unsigned long idx = expires - timer_jiffies;
        struct list_head * vec;

        if (run_timer_list_running)
                vec = run_timer_list_running;
        else if (idx < TVR_SIZE) {
                int i = expires & TVR_MASK;
                vec = tv1.vec + i;
        } else if (idx < 1 << (TVR_BITS + TVN_BITS)) {
                int i = (expires >> TVR_BITS) & TVN_MASK;
                vec = tv2.vec + i;
        } else if (idx < 1 << (TVR_BITS + 2 * TVN_BITS)) {
                int i = (expires >> (TVR_BITS + TVN_BITS)) & TVN_MASK;
                vec =  tv3.vec + i;
        } else if (idx < 1 << (TVR_BITS + 3 * TVN_BITS)) {
                int i = (expires >> (TVR_BITS + 2 * TVN_BITS)) & TVN_MASK;
                vec = tv4.vec + i;
        } else if ((signed long) idx < 0) {
                /* can happen if you add a timer with expires == jiffies,
                 * or you set a timer to go off in the past
                 */
                vec = tv1.vec + tv1.index;
        } else if (idx <= 0xffffffffUL) {
                int i = (expires >> (TVR_BITS + 3 * TVN_BITS)) & TVN_MASK;
                vec = tv5.vec + i;
        } else {
                /* Can only get here on architectures with 64-bit jiffies */
                INIT_LIST_HEAD(&timer->list);
                return;
        }
        /*
         * Timers are FIFO!
         */
        list_add(&timer->list, vec->prev);
}
这段代码为什么不写成如下方式:
else if (idx < TVR_SIZE) {
                vec = tv1.vec + idx;
        } else if (idx < 1 << (TVR_BITS + TVN_BITS)) {
                idx = (expires >> TVR_BITS) & TVN_MASK;
                vec = tv2.vec + idx;
        } else if (idx < 1 << (TVR_BITS + 2 * TVN_BITS)) {
                 idx = (expires >> (TVR_BITS + TVN_BITS)) & TVN_MASK;
                vec =  tv3.vec + idx;
        } else if (idx < 1 << (TVR_BITS + 3 * TVN_BITS)) {
                idx = (expires >> (TVR_BITS + 2 * TVN_BITS)) & TVN_MASK;
                vec = tv4.vec + idx;
        } else if ((signed long) idx < 0) {
                /* can happen if you add a timer with expires == jiffies,
                 * or you set a timer to go off in the past
                 */
                vec = tv1.vec + tv1.index;
        } else if (idx <= 0xffffffffUL) {
                idx = (expires >> (TVR_BITS + 3 * TVN_BITS)) & TVN_MASK;
                vec = tv5.vec + idx;


还要我经常看到如下代码
#define TVN_BITS 6
#define TVR_BITS 8
#define TVN_SIZE (1 << TVN_BITS)
#define TVR_SIZE (1 << TVR_BITS)
为什么不直接写成
#define TVN_SIZE 64
#define TVR_SIZE 256
发表于 2004-1-19 15:37:39 | 显示全部楼层
首先说宏的定义把,宏本身有个很好的地方是便于全局修改,如果定义为
#define TVN_SIZE 64
那么TVN_SIZE和TVN_BITS之间的联系明确吗?而且当你需要修改连表头数时,
你是不是必须修改两处呢?TVR_BITS  TVR_SIZE 都要修改!!

在说说你改的函数,这样改是可以,不过不觉的变量的意义被你破坏了吗?
int i的代价很小的,所以没必要为了这样的代价而破坏变量意义的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-16 10:15 , Processed in 0.043916 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表