ngx_regex_create_conf

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,表示成功创建并初始化正则表达式的配置。

总结

这个函数的设计思想是通过动态内存分配和清理机制创建和管理正则表达式的配置。它确保了在程序执行期间,正则表达式相关的资源被正确分配和释放。每一步都有错误处理,以确保系统的稳定性和可靠性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/984628.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

javaEE初阶————多线程进阶(2)

今天来继续带大家学习多线程进阶部分啦,今天是最后一期啦,下期带大家做一些多线程的题,我们就可以开始下一个环节啦; 1,JUC(java.util.concurrent)的常见类 1)Callable 接口 我们之…

初次体验Tauri和Sycamore(3)通道实现

​ 原创作者:庄晓立(LIIGO) 原创时间:2025年03月10日(发布时间) 原创链接:https://blog.csdn.net/liigo/article/details/146159327 版权所有,转载请注明出处。 20250310 LIIGO备注&…

【2025力扣打卡系列】0-1背包 完全背包

坚持按题型打卡&刷&梳理力扣算法题系列,语言为python3,Day5 0-1背包【目标和】 有n个物品,第i个物品的体积为w[i], 价值为v[i]。每个物品至多选一个,求体积和不超过capacity时的最大价值和常见变形 至多装capacity&#x…

windows下使用msys2编译ffmpeg

三种方法: 1、在msys2中使用gcc编译 2、在msys2中使用visual studio编译(有环境变量) 3、在msys2中使用visual studio编译(无环境变量) 我的环境: 1、msys2-x86_64-20250221 2、vs2015 3、ffmpeg-7.1…

引领变革!北京爱悦诗科技有限公司荣获“GAS消费电子科创奖-产品创新奖”!

在2025年“GAS消费电子科创奖”评选中,北京爱悦诗科技有限公司提交的“aigo爱国者GS06”,在技术创新性、设计创新性、工艺创新性、智能化创新性及原创性五大维度均获得评委的高度认可,荣获“产品创新奖”。 这一奖项不仅是对爱悦诗在消费电子…

cesium地图设置3d,2d,2.5d动态切换

通过修改cesium实例vw的scene的显示模式,来切换最终的显示模式。 Cesium.SceneMode总共有四个变量值,分别如下:NameTypeDescriptionMORPHINGnumber在3d与2d之间切换变体 between mode, e.g., 3D to 2D.COLUMBUS_VIEWnumber2.5d模式&#xff0…

Spring Boot 解析 LocalDateTime 失败?Uniapp 传输时间变 1970 的原因与解决方案

目录 前言1. 问题分析2. 时间戳(推荐,可尝试)3. 使用 JsonDeserialize & JsonSerialize(中立)4. 前端传 ISO-8601 格式(不推荐,可尝试)5. 用 String(中立&#xff09…

基于Spark的热门动漫推荐数据分析与可视化系统的设计与实现(采用Python语言Django框架,Hadoop,spider爬虫等技术实现)

基于Hadoop的热门动漫推荐数据分析与可视化系统 基于Django的热门动漫推荐数据分析与可视化系统 1. 开发工具和实现技术 Pycharm, Python3.7,Django框架,Hadoop,Spark,Hive,spider爬虫(爬取动漫之家的动…

【Java学习】泛型

面向对象系列八 一、泛型类变量 二、泛型实现 1.编译检查 2.类型擦除 3.泛型效果 三、类型检查 1.向上转型相关: 2.数组相关: 四、extend 1.非泛型下: 2.泛型中: 一、泛型类变量 一个类变量对里面位置引用变量的类型通泛…

nnMamba:基于状态空间模型的3D生物医学图像分割、分类和地标检测

摘要 本文提出了一种基于状态空间模型(SSMs)的创新架构——nnMamba,用于解决3D生物医学图像分割、分类及地标检测任务中的长距离依赖建模难题。nnMamba结合了卷积神经网络(CNN)的局部特征提取能力与SSMs的全局上下文建…

探索在生成扩散模型中基于RAG增强生成的实现与未来

概述 像 Stable Diffusion、Flux 这样的生成扩散模型,以及 Hunyuan 等视频模型,都依赖于在单一、资源密集型的训练过程中通过固定数据集获取的知识。任何在训练之后引入的概念——被称为 知识截止——除非通过 微调 或外部适应技术(如 低秩适…

OpenAI API模型ChatGPT各模型功能对比,o1、o1Pro、GPT-4o、GPT-4.5调用次数限制附ChatGPT订阅教程

本文包含OpenAI API模型对比页面以及ChatGPT各模型功能对比表 - 截至2025最新整理数据:包含模型分类及描述;调用次数限制; 包含模型的类型有: Chat 模型(如 GPT-4o、GPT-4.5、GPT-4)专注于对话&#xff0c…

【时间序列聚类】Feature-driven Time Series Clustering(特征驱动的时间序列聚类)

文章目录 1.文章介绍2.问题背景3.拟解决的问题4.主要贡献5.提出的方法5.1模型pipeline5.2特征抽取和选择5.3图渲染和社区检测5.4共现矩阵的构建5.5对共现矩阵进行聚类 6.实验6.1模型设置6.2实验结果6.3消融实验 7.结论8.个人观点9.Reference 1.文章介绍 论文出处:ED…

采用内存局部性分配有什么好处?

内存分配时的局部性分配(Locality of Allocation)是指将相关的内存对象分配在相邻或相近的内存区域中。这种分配策略在现代计算机系统中具有显著的好处,主要体现在以下几个方面: 1. 提高缓存命中率 现代计算机系统依赖于多级缓存…

Fast DDS Security--秘钥交换

Fast DDS Security模块中默认使用Diffie-Hellman算法进行秘钥交换。Diffie-Hellman 算法(简称 DH 算法)是一个非常重要的加密协议,用于在不安全的通信通道中安全地交换密钥。该算法通过利用数学中的离散对数问题来生成共享密钥,使…

3.3.5 VO-O语法- 高级语法

VO语言还提供了一些个性化的高级语法特性,这些语法特性有别于传统的编程语言。但可以更好的帮助开发者实现高效、稳定的生产级数据流程。 调度运行 在现行的编程语言中,调度运行不在语法表示范围之内。这属于具体的代码实现逻辑。但在VO语言设计中&…

NLP文本分析之依存句法分析(理论及技术实践)

引言 在自然语言处理(NLP)领域中,理解句子的语法结构是实现语义理解的基础。依存句法分析(Dependency Parsing) 作为句法分析的核心任务之一,通过揭示句子中词语之间的依存关系,为机器翻译、信…

LeetCode hot 100—爬楼梯

题目 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 示例 示例 1: 输入:n 2 输出:2 解释:有两种方法可以爬到楼顶。 1. 1 阶 1 阶 2. 2 阶 示例…

RoboVQA:机器人多模态长范围推理

23 年 11 月来自 Google Deepmind 的论文“RoboVQA: Multimodal Long-Horizon Reasoning for Robotics”。 本文提出一种可扩展、自下而上且本质多样化的数据收集方案,该方案可用于长期和中期的高级推理,与传统的狭窄自上而下的逐步收集相比&#xff0c…

WWDG窗口看门狗原理

WWDG(窗口看门狗)在窗口期喂狗 作用: 原理: 框图 WWDG寄存器: WWDG_CR控制寄存器 WWDG_CFR配置寄存器 状态寄存器WWDG_SR 超时时间计算公式 最小最大超时值 HAL配置函数: 1. IWDG 和 WWDG 的区别 IWDG&…