当前位置: 首页 > news >正文

Ubuntu 下 nginx-1.24.0 源码分析 - pool->cleanup

pool->cleanup

ngx_pool_s 定义在 src/core/ngx_palloc.h

struct ngx_pool_s {
    ngx_pool_data_t       d;
    size_t                max;
    ngx_pool_t           *current;
    ngx_chain_t          *chain;
    ngx_pool_large_t     *large;
    ngx_pool_cleanup_t   *cleanup;
    ngx_log_t            *log;
};

ngx_pool_cleanup_t

定义

typedef struct ngx_pool_cleanup_s  ngx_pool_cleanup_t;

struct ngx_pool_cleanup_s {
    ngx_pool_cleanup_pt   handler;
    void                 *data;
    ngx_pool_cleanup_t   *next;
};

ngx_pool_cleanup_s 类型及成员

ngx_pool_cleanup_s 是 Nginx 内存池(ngx_pool_t)中用于管理资源清理的结构体,
其核心作用是在内存池销毁时自动执行用户注册的清理逻辑


成员详解

(1) handler(函数指针)
  • 类型ngx_pool_cleanup_pt
    定义为:
    typedef void (*ngx_pool_cleanup_pt)(void *data);
    
  • 作用
    指向一个清理函数,当内存池被销毁时(调用 ngx_destroy_pool),该函数会被自动调用。
  • 意图
    提供一种机制,允许用户将资源释放逻辑(如关闭文件、释放锁、销毁临时数据)与内存池的生命周期绑定。例如:
    void my_cleanup(void *data) {
        int *fd = data;
        close(*fd);  // 关闭文件描述符
    }
    

(2) data(通用指针)
  • 类型void*
    指向任意类型的数据。
  • 作用
    存储需要传递给 handler 的上下文数据。例如,文件描述符、动态分配的内存地址、自定义结构体指针等。
  • 意图
    将清理操作与具体资源关联。

(3) next(链表指针)
  • 类型ngx_pool_cleanup_t*
    指向下一个 ngx_pool_cleanup_s 结构体。

  • 作用
    将多个清理项(ngx_pool_cleanup_s)串联成链表,形成一个清理队列。

  • 意图
    支持注册多个清理操作。内存池销毁时,按链表顺序依次执行所有 handler(通常为 LIFO 顺序,即后注册的先执行)。

  • 链表顺序
    新注册的清理项会被插入到链表头部(LIFO 顺序),因此销毁时最后注册的清理函数会先执行。


设计意图

资源生命周期管理
通过将资源释放逻辑与内存池绑定,确保资源在内存池销毁时自动释放,避免手动管理导致的内存泄漏或悬空指针。


http://www.dtcms.com/a/39594.html

相关文章:

  • 半导体制造工艺(二)光刻工艺—掩模版
  • SpringAI从人工智障到人工智能的实战改造
  • 人工智能时代:Python学习的全面攻略路线图
  • 二分法 ──── 算法3
  • JAVA实战开源项目:靓车汽车销售网站(Vue+SpringBoot) 附源码
  • 安装floodlight
  • unity学习54:图片+精灵+遮罩mask,旧版文本 text 和新的TMP文本
  • vi编辑器的使用(内附快捷键的使用)(超详细)
  • 图扑数字孪生:解锁压缩空气储能管控新高度
  • elementplus点击按钮直接预览图片
  • GitHub SSH连接问题解决指南
  • Python的那些事第三十一篇:快速数据帧处理与可视化的高效工具Vaex
  • 计算机毕业设计SpringBoot+Vue.js植物健康系统(源码+文档+PPT+讲解)
  • 使用ZFile打造属于自己的私有云系统结合内网穿透实现安全远程访问
  • 对话Stack Overflow,OceanBase CTO 杨传辉谈分布式数据库的“前世今生”
  • Template Method 设计模式
  • 企业数字化过程中数据仓库与商业智能 BI的目标
  • 算法-二叉树篇04-翻转二叉树
  • 开源软件的版权保护措施
  • JavaEE 编写Java程序,实现一个简单的echo程序(网络编程UDP实践练习)
  • 【Linux】learning notes(3)make、copy、move、remove
  • 1472.设计浏览器历史记录
  • 阿里重磅模型深夜开源;DeepSeek宣布开源DeepGEMM;微软开源多模态AI Agent基础模型Magma...|网易数智日报
  • 如何看待 Kaiming He 最新提出的 Fractal Generative Models ?
  • JAVA-如何理解Mysql的索引
  • 004 Kafka异常处理
  • SQL命令详解之操作数据库
  • 初会学习记录
  • Metal 学习笔记五:3D变换
  • SpringBoot接入DeepSeek(硅基流动版)+ 前端页面调试