如果hrtimer_hres_active返回false,说明目前处于低精度模式下,则继续处理,它用一个for循环遍历各个时间基准系统,查询每个hrtimer_clock_base对应红黑树的左下节点,判断它的时间是否到期,如果到期,通过__run_hrtimer函数,对到期定时器进行处理,包括:调用定时器的回调函数、从红黑树中移除该定时器、根据回调函数的返回值决...
cpu_base->softirq_activated = 1; /* 触发HRTIMER软中断 */ raise_softirq_irqoff(HRTIMER_SOFTIRQ); } /* 处理所有到期的硬timer,用户指定的hrtimer->function会在这里执行 */ __hrtimer_run_queues(cpu_base, now, flags, HRTIMER_ACTIVE_HARD); raw_spin_unlock_irqrestore(&cpu_base->lock, flags); ...
如果hrtimer_hres_active返回false,说明目前处于低精度模式下,则继续处理,它用一个for循环遍历各个时间基准系统,查询每个hrtimer_clock_base对应红黑树的左下节点,判断它的时间是否到期,如果到期,通过__run_hrtimer函数,对到期定时器进行处理,包括:调用定时器的回调函数、从红黑树中移除该定时器、根据回调函数的返回值决...
如果hrtimer_hres_active返回false,说明目前处于低精度模式下,则继续处理,它用一个for循环遍历各个时间基准系统,查询每个hrtimer_clock_base对应红黑树的左下节点,判断它的时间是否到期,如果到期,通过__run_hrtimer函数,对到期定时器进行处理,包括:调用定时器的回调函数、从红黑树中移除该定时器、根据回调函数的返回值决...
__hrtimer_run_queues(cpu_base, now, flags, HRTIMER_ACTIVE_HARD); /* 释放自旋锁并开中断 */ raw_spin_unlock_irqrestore(&cpu_base->lock, flags); } 每次调用 hrtimer_run_queues 函数的时候,也就是每次Tick到来的时候,都会判断是不是可以切换到高精度模式。如果确实可以切换,那就调用hrtimer_switch_to...
active字段是一个timerqueue_head结构,它实际上是对rbtree的进一步封装: [cpp]view plaincopy structtimerqueue_node { structrb_node node;// 红黑树的节点 ktime_t expires;// 该节点代表队hrtimer的到期时间,与hrtimer结构中的_softexpires稍有不同
struct timerqueue_head active;// 红黑树,包含了所有使用该时间基准系统的hrtimer ktime_t resolution;// 时间基准系统的分辨率 ktime_t (*get_time)(void);// 获取该基准系统的时间函数 ktime_t softirq_time;// 当用jiffies ktime_t offset;// ...
hrtimer_start_expires(&t.timer, mode);if(!hrtimer_active(&t.timer)) t.task =NULL;if(likely(t.task)) schedule(); hrtimer_cancel(&t.timer); destroy_hrtimer_on_stack(&t.timer); __set_current_state(TASK_RUNNING);return!t.task ?0: -EINTR; ...
1754 __hrtimer_run_queues(cpu_base, now, flags, HRTIMER_ACTIVE_HARD) 1755 raw_spin_unlock_irqrestore( & lock, flags) 调用者 名称描述 run_local_timers 检查有没有定时器到期,有就运行到期定时器的处理源代码转换工具开放的插件接口 X 支持:c/c++/esqlc/java Oracle/Informix/Mysql插件可实现:逻辑...
struct hrtimer_clock_base *new_base){structhrtimer*timer;structrb_node*node;while((node = rb_first(&old_base->active))) { timer = rb_entry(node, struct hrtimer, node); BUG_ON(hrtimer_callback_running(timer)); debug_hrtimer_deactivate(timer);/* ...