zoukankan      html  css  js  c++  java
  • __run_timers() -- 处理全部超时定时器

    __run_timers() -- 处理全部超时定时器
    
    run_timer_softirq() --> __run_timers()
    
    /usr/src/linux-2.6.19/kernel/timer.c
    
    static inline void __run_timers(tvec_base_t *base)
    {
        structtimer_list *timer;
    
        spin_lock_irq(&base->lock);
        /*处理所有已经超时的定时器*/
        while (time_after_eq(jiffies, base->timer_jiffies)) {
            structlist_headwork_list;
            structlist_head *head = &work_list;
            int index = base->timer_jiffies & TVR_MASK;           //(0)   
    
            /*
             * Cascade timers:
             */
            if (!index &&
                (!cascade(base, &base->tv2, INDEX(0))) &&
                (!cascade(base, &base->tv3, INDEX(1))) &&
                !cascade(base, &base->tv4, INDEX(2)))
                cascade(base, &base->tv5, INDEX(3));
            ++base->timer_jiffies;
            list_replace_init(base->tv1.vec + index, &work_list); //(1)
            /*处理base->tv1.vec[index]链表上的所有定时器*/
            while (!list_empty(head)) {
                void (*fn)(unsigned long);
                unsigned long data;
    
                timer = list_entry(head->next, structtimer_list, entry);
                fn = timer->function;
                data = timer->data;
    
                set_running_timer(base, timer);
                detach_timer(timer, 1);
                spin_unlock_irq(&base->lock);
                {
                    intpreempt_count = preempt_count();
                    fn(data);//在不带锁的情况下执行定时器函数
                    if (preempt_count != preempt_count()) {
                        printk(KERN_WARNING "huh, entered %p "
                               "with preempt_count %08x, exited"
                               " with %08x?
    ",
                               fn, preempt_count,
                               preempt_count());
                        BUG();
                    }
                }
                spin_lock_irq(&base->lock);
            }
        }
        set_running_timer(base, NULL);
        spin_unlock_irq(&base->lock);
    }
    
    
    (1)
    TVR_MASK = 255 = 11111111
    --------------------------------------
    #define TVR_MASK (TVR_SIZE - 1) 
    #define TVR_SIZE (1 << TVR_BITS)
    #define TVR_BITS (CONFIG_BASE_SMALL ? 6 : 8)
    
    CONFIG_BASE_SMALL=0
    
    (2) 根据base->timer_jiffies获取tv1所管理的数组的一个元素 -- 一个定时器队列
  • 相关阅读:
    Android蓝牙A2DP连接实现
    精确率、召回率、准确率与ROC曲线
    gcc/g++ 使用 tricks
    python 实现 KNN 分类器——手写识别
    vim 使用 Tricks
    树莓派与node.js —— onoff、dht
    npm 包管理器的使用
    Opencv-Python 图像透视变换cv2.warpPerspective
    advanced ip scanner —— 局域网下 ip 及设备的扫描
    CPU 架构 —— ARM 架构
  • 原文地址:https://www.cnblogs.com/coucar/p/3176751.html
Copyright © 2011-2022 走看看