注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

偶有所得,记录在此

有分享交流才有进步,永远不要固步自封

 
 
 

日志

 
 

Nginx Event IO 处理细节分析  

2010-12-29 11:57:05|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
以 ngx_http_upstream.c 中 ngx_http_upstream_connect 函数为例。

在进入事件循环之前,先设定好 Read 和 Write Event 的 Handler

    c->write->handler = ngx_http_upstream_handler;
    c->read->handler = ngx_http_upstream_handler;

    u->write_event_handler = ngx_http_upstream_send_request_handler;
    u->read_event_handler = ngx_http_upstream_process_header;

进入 ngx_http_upstream_send_request,然后执行输出:
    rc = ngx_output_chain(&u->output, u->request_sent ? NULL : u->request_bufs);

rc 返回值主要有两种:NGX_OK,NGX_AGAIN。
-----------------------------------------------------------
NGX_OK 时,添加 Read Event,等待 upstream 返回。

NGX_AGAIN 时,表明数据未发送完成。再次添加 Write Event:
         ngx_add_event(wev, NGX_WRITE_EVENT,
                                  NGX_CLEAR_EVENT | (lowat ? NGX_LOWAT_EVENT : 0))
事件触发时,会再次进入 ngx_http_upstream_send_request 发送数据


Connection 和 ngx_event_s 结构体关系
-------------------------------------------------
c 代表一个 connection ,作为 c 的成员,write  和 read 分别是一个 ngx_event_s 类型结构体;
struct ngx_event_s {
        void            *data;
       ...
}
在 Nginx 中, ngx_event_s 的 data 成员,实际上指向的是该 connection。
正式由于这种结构关系,Nginx 的事件处理少了很多相关的参数传递,显得非常简单。

相关代码如下:
ngx_get_connection 函数中:
    rev = c->read;
    wev = c->write;
    ...
    rev->data = c;
    wev->data = c;
  评论这张
 
阅读(1474)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017