Skip to content

Commit

Permalink
update 15th timer
Browse files Browse the repository at this point in the history
  • Loading branch information
LinkedDestiny committed Nov 5, 2014
1 parent 3267629 commit 17167c3
Showing 1 changed file with 32 additions and 32 deletions.
64 changes: 32 additions & 32 deletions 15.Timer模块分析.md
Expand Up @@ -2,30 +2,30 @@
---
#Table of Contents
- [1.Timer]()
- [1.1.swTimer_interval_node结构体]()
- [1.2.swTimer_node结构体]()
- [1.3.swTimer结构体]()
- [1.4.swTimer公共操作函数]()
- [1.4.1.swTimer_init](#1.4.1.swTimer_init)
- [1.4.2.swTimer_signal_handler](#1.4.2.swTimer_signal_handler)
- [1.4.3.swTimer_event_handler](#1.4.3.swTimer_event_handler)
- [1.4.4.其他函数]()
- [1.5.Timer私有操作函数]()
- [1.5.1.swTimer_signal_set](#1.5.1.swTimer_signal_set)
- [1.5.2.swTimer_timerfd_set](#1.5.2.swTimer_timerfd_set)
- [1.5.3.swTimer_del](#1.5.3.swTimer_del)
- [1.5.4.swTimer_free](#1.5.4.swTimer_free)
- [1.5.5.swTimer_add](#1.5.5.swTimer_add)
- [1.5.6.swTimer_set](#1.5.6.swTimer_set)
- [1.5.7.swTimer_addtimeout](#1.5.7.swTimer_addtimeout)
- [1.5.8.swTimer_select](#1.5.8.swTimer_select)
- [2.EventTimer]()
- [2.1.EventTimer原理]()
- [2.2.EventTimer私有操作函数]()
- [2.2.1.swEventTimer_add](#2.2.1.swEventTimer_add)
- [2.2.1.swEventTimer_del](#2.2.1.swEventTimer_del)
- [2.2.1.swEventTimer_select](#2.2.1.swEventTimer_select)
- [2.2.1.swEventTimer_free](#2.2.1.swEventTimer_free)
- [1.1.swTimer_interval_node结构体](#11swtimer_interval_node)
- [1.2.swTimer_node结构体](#12swtimer_node)
- [1.3.swTimer结构体](#13swtimer)
- [1.4.swTimer公共操作函数](#14swtimer%E5%85%AC%E5%85%B1%E6%93%8D%E4%BD%9C%E5%87%BD%E6%95%B0)
- [1.4.1.swTimer_init](#141swTimer_init)
- [1.4.2.swTimer_signal_handler](#142swTimer_signal_handler)
- [1.4.3.swTimer_event_handler](#143swTimer_event_handler)
- [1.4.4.其他函数](#144%E5%85%B6%E4%BB%96%E5%87%BD%E6%95%B0)
- [1.5.Timer私有操作函数](#15timer%E7%A7%81%E6%9C%89%E6%93%8D%E4%BD%9C%E5%87%BD%E6%95%B0)
- [1.5.1.swTimer_signal_set](#151.swTimer_signal_set)
- [1.5.2.swTimer_timerfd_set](#152.swTimer_timerfd_set)
- [1.5.3.swTimer_del](#153swTimer_del)
- [1.5.4.swTimer_free](#154swTimer_free)
- [1.5.5.swTimer_add](#155swTimer_add)
- [1.5.6.swTimer_set](#156swTimer_set)
- [1.5.7.swTimer_addtimeout](#157swTimer_addtimeout)
- [1.5.8.swTimer_select](#158swTimer_select)
- [2.EventTimer](#2eventtimer)
- [2.1.EventTimer原理](#21eventtimer%E5%8E%9F%E7%90%86)
- [2.2.EventTimer私有操作函数](22eventtimer%E7%A7%81%E6%9C%89%E6%93%8D%E4%BD%9C%E5%87%BD%E6%95%B0)
- [2.2.1.swEventTimer_add](#221swEventTimer_add)
- [2.2.1.swEventTimer_del](#221swEventTimer_del)
- [2.2.1.swEventTimer_select](#221swEventTimer_select)
- [2.2.1.swEventTimer_free](#221swEventTimer_free)

---
**swoole版本:1.7.7-stable**
Expand Down Expand Up @@ -192,9 +192,9 @@ int swTimer_init(int interval_ms, int no_pipe);
```
源码解释:<br>
获取**SwooleG**中的timer对象,设置timer响应间隔和lasttime参数。如果没有定义**HAVE_TIMERFD**,则设置不使用timerfd。随后,使用HashMap初始化timer链表list。<br>
如果使用了timerfd,调用[swTimer_timerfd_set](#1.5.2.swTimer_timerfd_set)函数设置timer的基础响应间隔,并设置不使用管道。<br>
如果不使用timerfd而使用signalfd,则先判定是否需要管道,如果需要,则创建管道并获取管道的写fd。随后,调用[swTimer_signal_set](#1.5.1.swTimer_signal_set)函数设置Linux系统提供的精确定时器,并通过swSignal_add添加对SIGALRM信号的处理回调函数[swTimer_signal_handler](#1.4.2.swTimer_signal_handler)。<br>
接着,将管道写fd加入main_reactor的监听中,并设置回调函数[swTimer_event_handler](#1.4.3.swTimer_event_handler)。<br>
如果使用了timerfd,调用[swTimer_timerfd_set](#152swTimer_timerfd_set)函数设置timer的基础响应间隔,并设置不使用管道。<br>
如果不使用timerfd而使用signalfd,则先判定是否需要管道,如果需要,则创建管道并获取管道的写fd。随后,调用[swTimer_signal_set](#151swTimer_signal_set)函数设置Linux系统提供的精确定时器,并通过swSignal_add添加对SIGALRM信号的处理回调函数[swTimer_signal_handler](#142swTimer_signal_handler)。<br>
接着,将管道写fd加入main_reactor的监听中,并设置回调函数[swTimer_event_handler](#143swTimer_event_handler)。<br>
最后设置swTimer的四个回调操作函数。<br>

####**1.4.2.swTimer_signal_handler**
Expand Down Expand Up @@ -239,7 +239,7 @@ int swTimer_event_handler(swReactor *reactor, swEvent *event);
return swTimer_select(timer);
```
源码解释:<br>
尝试从管道中读取数据,如果读取成功,则重置**SwooleG**的signal_alarm标记,并调用[swTimer_select](#1.5.8.swTimer_select)来处理定时任务;
尝试从管道中读取数据,如果读取成功,则重置**SwooleG**的signal_alarm标记,并调用[swTimer_select](#158swTimer_select)来处理定时任务;

####**1.4.4.其他函数**
**swTimer_node_insert****swTimer_node_print****swTimer_node_delete****swTimer_node_destory**四个函数是链表操作函数,不再详细分析。
Expand Down Expand Up @@ -407,8 +407,8 @@ static int swTimer_add(swTimer *timer, int msec, int interval, void *data);
timer->num++;
```
源码解释:<br>
如果interval为0,说明这个定时器是个timeout类型定时器,调用[swTimer_addtimeout](#1.5.7.swTimer_addtimeout)函数。<br>
否则,创建一个**swTimer_interval_node**结构体,设置其相关属性,并根据interval计算timer的基础响应间隔,并调用[swTimer_set](#1.5.6.swTimer_set)函数设置新的定时间隔。<br>
如果interval为0,说明这个定时器是个timeout类型定时器,调用[swTimer_addtimeout](#157swTimer_addtimeout)函数。<br>
否则,创建一个**swTimer_interval_node**结构体,设置其相关属性,并根据interval计算timer的基础响应间隔,并调用[swTimer_set](#156swTimer_set)函数设置新的定时间隔。<br>
最后,将新的定时任务节点添加进timer的list,并将定时器数量增加1。

####**1.5.6.swTimer_set**
Expand All @@ -430,7 +430,7 @@ static int swTimer_set(swTimer *timer, int new_interval);
}
```
源码解释:<br>
如果使用了timerfd,调用[swTimer_timerfd_set](#1.5.2.swTimer_timerfd_set);否则,调用[swTimer_signal_set](#1.5.1.swTimer_signal_set);
如果使用了timerfd,调用[swTimer_timerfd_set](#152swTimer_timerfd_set);否则,调用[swTimer_signal_set](#151swTimer_signal_set);

####**1.5.7.swTimer_addtimeout**
声明:
Expand Down Expand Up @@ -550,7 +550,7 @@ int swTimer_select(swTimer *timer);
判定**onTimeout**回调是否被设置,如果未设置则返回错误。随后,遍历timeout定时任务列表,找到exec_msec时间小于等于当前时间的任务,调用onTimeout响应这些回调,并移除该任务。<br>
判定**onTimer**回调是否被设置,如果未设置则返回错误。随后,遍历定时任务列表,判定当前节点是否需要响应(当前时间 - lasttime >= interval - 1ms),如果需要响应则设置新的lasttime并调用onTimer回调。<br>

##**1.EventTimer**
##**2.EventTimer**
###**2.1.EventTimer原理**
EventTimer的实现原理是利用了epoll的timeout超时设置。通过设置epoll的timeout,就能在timeout时间后捕获一个事件,在捕获该事件后,通过遍历对应的事件列表即可得知哪些事件需要处理。
###**2.2.EventTimer私有操作函数**
Expand Down

0 comments on commit 17167c3

Please sign in to comment.