4.5.3 HTTP框架如何维护上下文结构

首先看一下ngx_http_request_t结构的ctx成员。


struct ngx_http_request_s{

……

void**ctx;

……

};


可以看到,ctx与4.3.2节中ngx_http_conf_ctx_t结构的3个数组成员非常相似,它们都表示指向void*指针的数组。HTTP框架就是在ctx数组中保存所有HTTP模块上下文结构体的指针的。

HTTP框架在开始处理1个HTTP请求时,会在创建ngx_http_request_t结构后,建立ctx数组来存储所有HTTP模块的上下文结构体指针(请求ngx_http_request_t的ctx成员是一个指针数组,其初始化详见图11-2的第9步)。


r->ctx=ngx_pcalloc(r->pool,sizeof(voidngx_http_max_module);

if(r->ctx==NULL){

ngx_destroy_pool(r->pool);

ngx_http_close_connection(c);

return;

}


对比4.5.2节中的两个宏的定义可以看出,ngx_http_get_module_ctx和ngx_http_set_ctx只是去获取或者设置ctx数组中相应HTTP模块的指针而已。