Nginx源碼分析之中原六仔源碼修復
if (cmd->type & NGX_DIRECT_CONF) {
/"daemon" "worker_processes"等指令為NGX_DIRECT_CONF指令
其實也是NGX_MAIN_CONF指令,但是先判斷了NGX_DIRECT_CONF所以走這個分支
*/
conf = ((void **) cf->ctx)[ngx_modules[i]->index];
} else if (cmd->type & NGX_MAIN_CONF) {
conf = &(((void **) cf->ctx)[ngx_modules[i]->index]);
} else if (cf->ctx) {
/這些指令都是隸屬於上層指令之下的指令,比如HTTP的server指令等/
confp = *(void *) ((char ) cf->ctx + cmd->conf);
if (confp) { conf = confp[ngx_modules[i]->ctx_index]; printf("-- else conf:%p\n", conf); }
}
NGX_DIRECT_CONF和NGX_MAIN_CONF表示是配置文件的最外層指令,不同點在於DIRECT和NGX_MAIN_CONF配置的內存操作有差異。
cf->ctx都是在 函數 ngx_init_cycle中通過cycle->conf_ctx = ngx_pcalloc(pool, ngx_max_module sizeof(void ))獲取得到的內存。
所以 DIRECT類型 指令 獲取的 conf 是 cycle->conf_ctx[index],而 MAIN 類型指令獲取的 conf 是&cycle->conf_ctx[index]。
對於DIRECT指令,獲取到的conf是自己create_conf返回的內存。 例如 ngx_core_module_create_conf、ngx_regex_create_conf等core module的create_conf註冊函數,所以 cmd->set 中直接使用這個conf就行了。
對於MAIN指令,conf取得是 cycle->conf_ctx[index] 的地址而不是裏面的值,其實純MAIN指令,沒有create_conf指令,cf->ctx[index]取出來也是NULL,所以取conf = &cf->ctx[index]的目的,就是取二級指針,然後在cmd->set函數中,執行類似*conf = malloc(..)的操作,相當於對cf->ctx[index]進行賦值。
話句話說,MAIN指令,其ctx不可能由create_conf簡單的創建出來或者壓根不需要在create_conf階段創建內存,所以需要在cmd->set中自行處理。
Nginx源碼分析之中原六仔源碼修復