ngx_regex_create_conf
定义在 src/core/ngx_regex.c
static void *
ngx_regex_create_conf(ngx_cycle_t *cycle)
{ngx_regex_conf_t *rcf;ngx_pool_cleanup_t *cln;rcf = ngx_pcalloc(cycle->pool, sizeof(ngx_regex_conf_t));if (rcf == NULL) {return NULL;}rcf->pcre_jit = NGX_CONF_UNSET;cln = ngx_pool_cleanup_add(cycle->pool, 0);if (cln == NULL) {return NULL;}cln->handler = ngx_regex_cleanup;cln->data = rcf;rcf->studies = ngx_list_create(cycle->pool, 8, sizeof(ngx_regex_elt_t));if (rcf->studies == NULL) {return NULL;}ngx_regex_studies = rcf->studies;return rcf;
}
ngx_regex_create_conf
函数是 Nginx 的一部分,用于创建正则表达式的配置结构体 ngx_regex_conf_t
static void *
ngx_regex_create_conf(ngx_cycle_t *cycle)
-
函数声明:定义一个静态函数 ngx_regex_create_conf
,它接受一个指向 ngx_cycle_t
结构的指针作为参数,并返回一个指向 void
的指针。这里的 cycle
代表当前的 Nginx 运行周期。
{ngx_regex_conf_t *rcf;ngx_pool_cleanup_t *cln;
-
变量声明:声明两个指针变量:
-
rcf
:指向 ngx_regex_conf_t
结构的指针,用于保存正则表达式的配置信息。
-
cln
:指向 ngx_pool_cleanup_t
结构的指针,用于处理内存清理。
rcf = ngx_pcalloc(cycle->pool, sizeof(ngx_regex_conf_t));
-
内存分配:使用 ngx_pcalloc
函数在 Nginx 的内存池中分配 ngx_regex_conf_t
结构的内存。
-
ngx_pcalloc
会清零分配的内存,确保结构中的所有字段初始化为零或空值。
if (rcf == NULL) {return NULL;}
-
空指针检查:检查内存分配是否成功。
-
如果 rcf
为 NULL
,则返回 NULL
,表示配置创建失败。这是一个重要的错误处理步骤。
rcf->pcre_jit = NGX_CONF_UNSET;
-
初始化配置字段:将 rcf
中的 pcre_jit
字段初始化为 NGX_CONF_UNSET
,表示该字段尚未被设置。
-
这是为了在后续的配置解析中能够判断是否对该字段进行了修改。
cln = ngx_pool_cleanup_add(cycle->pool, 0);
-
添加清理处理:在内存池中添加一个清理处理。
-
如果 cycle->pool
被销毁时,这个清理处理会被调用。第二个参数 0
表示这个清理处理的优先级。
if (cln == NULL) {return NULL;}
-
清理处理检查:检查 cln
是否为 NULL
,如果是,则返回 NULL
,表示添加清理处理失败。
cln->handler = ngx_regex_cleanup;
-
设置清理处理函数:将清理处理的 handler
指定为 ngx_regex_cleanup
,
-
这个函数将在内存池被释放时调用,用于释放与正则表达式配置相关的资源。
cln->data = rcf;
-
设置清理数据:将清理处理的数据字段设置为 rcf
,这样在清理函数中可以访问到正则表达式的配置结构。
rcf->studies = ngx_list_create(cycle->pool, 8, sizeof(ngx_regex_elt_t));
-
创建正则表达式研究列表:在内存池中创建一个 ngx_list_t
结构,用于存储正则表达式的研究。这里设置初始大小为 8,每个元素的大小为 ngx_regex_elt_t
。这个列表将用于存放与正则表达式相关的研究数据。
if (rcf->studies == NULL) {return NULL;}
-
研究列表检查:检查 rcf->studies
是否为 NULL
,如果是,则返回 NULL
,表示创建研究列表失败。
ngx_regex_studies = rcf->studies;
-
全局变量赋值:将全局变量 ngx_regex_studies
指向当前配置的研究列表。这使得其他部分的代码可以访问到这个列表。
return rcf;
}
-
返回配置结构:最后,返回指向 ngx_regex_conf_t
结构的指针 rcf
,表示成功创建并初始化正则表达式的配置。
总结
这个函数的设计思想是通过动态内存分配和清理机制创建和管理正则表达式的配置。它确保了在程序执行期间,正则表达式相关的资源被正确分配和释放。每一步都有错误处理,以确保系统的稳定性和可靠性。