分析 webkit 的Timer类

来源:互联网 发布:淘宝商家在哪找的货源 编辑:程序博客网 时间:2024/05/18 18:16

转载,请注明出处!

Timer类是webkit 内核的一个必需的基础组件。有很多功能的实现需要依赖此类提供的功能。详细阅读了与Timer相关的各个c++类,滤清了Timer事件的产生、传输机制。

与Timer有关的类包括MainThreadSharedTimer, SharedTimer, ThreadTimers, ThreadGlobalData, Timer, Timer。另外,需要用到三个与平台相关的接口setSharedTimerFiredFunction(void(*)()), setSharedTimerFireInterval(double), stopSharedTimer。这些类之间的依赖关系以及个别类的功能如下图所示:



PlatformPort表示与平台相关的接口。平台提供三个接口setSharedTimerFiredFunction(void (*)()), setSharedTimerFireInterval(double), stopSharedTimer。不同的平台实现这三个接口的方法不同。假如是xxx平台,那么在SharedTimerXXX.cpp文件中定义了三个接口。

SharedTimer是一个纯虚基类,提供了三个重要的函数1)setFiredFunction 用于设置处理timer事件的回调函数2)setFireInterval用于设置产生timer事件的时间间隔3)stop停止处理timer事件。

MainThreadSharedTimer是SharedTimer的子类。此类直接调用平台提供的接口实现setFiredFunction,setSharedTimerFireInterval,stopSharedTimer三个方法。

ThreadTimers类的基本功能是:取出最近要处理timer事件的任务,将任务的时间间隔设置为m_sharedTimer的时间间隔。当timer事件产生时,让m_timerHeap的第一个元素处理timer事件。然后将这个任务从m_timerHeap中删除。更新m_timerHeap中的顺序,然后取出最近要处理timer事件的任务,....如此循环直至m_timerHeap中没有任务为止。ThreadTimers类中有两个重要的成员变量:m_timerHeap和m_sharedTimer。m_timerHeap是一个以nextFireTime作为关键字,按照升序排列的有序数组。即,将最先处理Timer事件的任务放在m_timerHeap数组的首部。m_timerSharedTimer是SharedTimer对象的指针。只要将TimerBase类型的对象按序插入m_timerHeap中,当timer事件产生时,ThreadTimers会自动回调TimerBase::fire函数。ThreadTimers类中有几个重要的方法1)静态方法sharedTimerFired。本类会将sharedTimerFired设为SharedTimer的回调函数。当产生SharedTimer事件时,sharedTimerFired会被调用。sharedTimerFired获得属于当前线程的ThreadTimer 对象obj。执行obj.sharedTimerFiredInternal方法。2)sharedTimerFiredInternal实例方法。obj.sharedTimerFiredInternal方法会取出m_timerHeap的第一个元素,让该元素响应timer事件。3)updateSharedTimer实例方法。updateSharedTimer方法会取出m_timerHeap首元素,将它的nextFireTime设置为sharedTimer的nextFireTime。在设置sharedTimer之后,每次处理完Timer事件之后,以及重置sharedTimer之后,都会调用执行updateSharedTimer方法。

ThreadGlobalData对象是与线程相关的对象,每一个线程只会存在一个ThreadGlobalData对象。另外,在创建ThreadGlobalData对象时,也会创建ThreadTimer。通过全局函数threadGlobalData就可以获得当前线程的ThreadGlobalData对象。一般可以通过threadGlobalData().threadTimers().timerHeap()获得m_timerHeap对象,然后将TimerBase对象按序插入m_timerHeap对象即可。注:泛型ThreadSpecific实现了每个线程拥有独特的对象。在不同平台上,ThreadSpecific的实现方法不同。在windows平台,使用tls实现ThreadSpecific类。

创建ThreadGlobalData对象的流程图如下,




将TimerBase对象加入m_timerHeap的流程图如下,



参考:webkit源码

原创粉丝点击