聲明在?src/core/ngx_module.h
ngx_int_t ngx_cycle_modules(ngx_cycle_t *cycle);
實現在?src/core/ngx_module.c
ngx_int_t
ngx_cycle_modules(ngx_cycle_t *cycle)
{/** create a list of modules to be used for this cycle,* copy static modules to it*/cycle->modules = ngx_pcalloc(cycle->pool, (ngx_max_module + 1)* sizeof(ngx_module_t *));if (cycle->modules == NULL) {return NGX_ERROR;}ngx_memcpy(cycle->modules, ngx_modules,ngx_modules_n * sizeof(ngx_module_t *));cycle->modules_n = ngx_modules_n;return NGX_OK;
}
這個函數ngx_cycle_modules
的作用是為當前Nginx服務器周期(cycle)初始化并設置模塊列表。具體來說:
-
函數為當前周期分配內存,用于存儲模塊指針數組
-
將靜態定義的模塊列表(ngx_modules
)復制到當前周期的模塊列表中
-
設置當前周期的模塊數量
ngx_cycle_modules
?函數的簽名如下:
ngx_int_t ngx_cycle_modules(ngx_cycle_t *cycle);
以下是對函數簽名的詳細解析:
1. 返回值類型 ngx_int_t
類型定義:ngx_int_t 是 Nginx 自定義的整數類型,用于統一跨平臺的整數表示。
語義:
NGX_OK(值為 0):表示函數執行成功。
NGX_ERROR(值為 -1):表示函數執行失敗(如內存分配失敗)。
作用:通過返回狀態碼,通知調用者函數執行結果。
2. 參數 ngx_cycle_t *cycle
參數類型:ngx_cycle_t 是 Nginx 的核心結構體,表示一個運行周期(如啟動、重載配置時的實例)。
詳解
注釋部分
/** create a list of modules to be used for this cycle,* copy static modules to it*/
作用:說明函數的核心目標。
背景:
Nginx 的模塊在編譯時靜態注冊到全局數組 ngx_modules。
每個運行周期(cycle)需要獨立的模塊列表,以支持配置重載時的多實例隔離。
設計思想:
隔離性:通過復制全局模塊到 cycle,避免不同周期(如舊配置與新配置)的模塊相互干擾。
分配模塊數組內存
cycle->modules = ngx_pcalloc(cycle->pool, (ngx_max_module + 1) * sizeof(ngx_module_t *));
作用:在 cycle 的內存池中分配內存,存儲模塊指針數組。
關鍵參數:
cycle->pool:Nginx 內存池,確保高效內存管理(避免頻繁 malloc/free)。
ngx_max_module + 1:ngx_max_module 是編譯時定義的最大模塊數,+1?用于預留終止標記(如 NULL)
檢查內存分配
if (cycle->modules == NULL) {return NGX_ERROR;
}
-
作用:驗證內存分配是否成功。
-
邏輯:若?ngx_pcalloc
?返回?NULL
,直接返回錯誤碼?NGX_ERROR
復制全局模塊到周期模塊列表
ngx_memcpy(cycle->modules, ngx_modules, ngx_modules_n * sizeof(ngx_module_t *));
作用:將全局模塊數組 ngx_modules 拷貝到 cycle->modules
關鍵變量:
ngx_modules:全局靜態模塊數組,編譯時生成。
ngx_modules_n:全局模塊數量,編譯時確定。
僅復制實際存在的模塊(ngx_modules_n 個),而非整個預分配空間。
記錄模塊數量
cycle->modules_n = ngx_modules_n;
-
作用:將全局模塊數量?ngx_modules_n
?賦值給?cycle->modules_n
-
邏輯:
-
cycle->modules_n
?后續用于遍歷模塊(如初始化模塊時)
返回成功狀態
return NGX_OK;
Ubuntu 下 nginx-1.24.0 源碼分析 - ngx_modules-CSDN博客