Skip to content

Commit

Permalink
ngx_event
Browse files Browse the repository at this point in the history
  • Loading branch information
chronolaw committed Apr 22, 2016
1 parent 8095965 commit c99129d
Show file tree
Hide file tree
Showing 3 changed files with 9 additions and 1 deletion.
2 changes: 2 additions & 0 deletions nginx/src/event/modules/ngx_epoll_module.c
Original file line number Diff line number Diff line change
Expand Up @@ -933,6 +933,7 @@ ngx_epoll_notify(ngx_event_handler_pt handler)
// epoll模块核心功能,调用epoll_wait处理发生的事件
// 使用event_list和nevents获取内核返回的事件
// timer是无事件发生时最多等待的时间,即超时时间
// 如果ngx_event_find_timer返回timer==0,那么epoll不会等待,立即返回
// 函数可以分为两部分,一是用epoll获得事件,二是处理事件,加入延后队列
// 函数里不处理定时器,因为定时器不属于epoll事件
static ngx_int_t
Expand All @@ -956,6 +957,7 @@ ngx_epoll_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, ngx_uint_t flags)
// 使用event_list和nevents获取内核返回的事件
// 返回值events是实际获得的事件数量
// epoll_wait等待最多timer时间后返回
// 如果ngx_event_find_timer返回timer==0,那么epoll不会等待,立即返回
events = epoll_wait(ep, event_list, (int) nevents, timer);

// 检查是否发生了错误
Expand Down
6 changes: 5 additions & 1 deletion nginx/src/event/ngx_event.c
Original file line number Diff line number Diff line change
Expand Up @@ -314,7 +314,9 @@ ngx_process_events_and_timers(ngx_cycle_t *cycle)
flags = 0;

} else {
// 没有设置时间精度
// 在定时器红黑树里找到最小的时间,二叉树查找很快
// timer==0意味着在红黑树里已经有事件超时了,必须立即处理
timer = ngx_event_find_timer();

// NGX_UPDATE_TIME要求epoll等待这个时间,然后主动更新时间
Expand Down Expand Up @@ -361,12 +363,13 @@ ngx_process_events_and_timers(ngx_cycle_t *cycle)
} else {
// 未获取到锁
// 要求epoll无限等待,或者等待时间超过配置的ngx_accept_mutex_delay
// 也就是说nginx的epoll不会等待超过ngx_accept_mutex_delay的500毫秒
if (timer == NGX_TIMER_INFINITE
|| timer > ngx_accept_mutex_delay)
{
// epoll的超时时间最大就是ngx_accept_mutex_delay
// ngx_accept_mutex_delay = ecf->accept_mutex_delay;
// 如果时间精度设置的太粗,那么就使用这个时间
// 如果时间精度设置的太粗,那么就使用这个时间,500毫秒
timer = ngx_accept_mutex_delay;
}
}
Expand All @@ -386,6 +389,7 @@ ngx_process_events_and_timers(ngx_cycle_t *cycle)
// epoll模块核心功能,调用epoll_wait处理发生的事件
// 使用event_list和nevents获取内核返回的事件
// timer是无事件发生时最多等待的时间,即超时时间
// 如果ngx_event_find_timer返回timer==0,那么epoll不会等待,立即返回
// 函数可以分为两部分,一是用epoll获得事件,二是处理事件,加入延后队列
(void) ngx_process_events(cycle, timer, flags);

Expand Down
2 changes: 2 additions & 0 deletions nginx/src/event/ngx_event_timer.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ ngx_event_timer_init(ngx_log_t *log)

// 在红黑树里查找最小值,即最左边的节点,得到超时的时间差值
// 如果时间已经超过了,那么时间差值就是0
// 意味着在红黑树里已经有事件超时了,必须立即处理
ngx_msec_t
ngx_event_find_timer(void)
{
Expand All @@ -61,6 +62,7 @@ ngx_event_find_timer(void)
timer = (ngx_msec_int_t) (node->key - ngx_current_msec);

// 如果时间已经超过了,那么时间差值就是0
// 意味着在红黑树里已经有事件超时了,必须立即处理
return (ngx_msec_t) (timer > 0 ? timer : 0);
}

Expand Down

0 comments on commit c99129d

Please sign in to comment.