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

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.kler.cn/a/563673.html

相关文章:

  • Graph and GNN——图的表示与图神经网络的介绍与应用
  • 青少年编程与数学 02-010 C++程序设计基础 11课题、程序结构
  • 手机放兜里,支付宝“碰一下”被盗刷?
  • Selenium八大元素定位方式
  • Docker 基本概念[SpringBoot之Docker实战系列] - 第536篇
  • 机试刷题_NC52 有效括号序列【python】
  • 基于 Python 的网络监控系统开发全解
  • 【我的 PWN 学习手札】IO_FILE 之 利用IO_validate_vtable劫持程序流
  • Linux(Centos 7.6)命令详解:uniq
  • 从 0 到 1,用 Python 构建超实用 Web 实时聊天应用
  • 【QT】QLinearGradient 线性渐变类简单使用教程
  • 深入解析Java线程优先级的奥秘
  • 文件上传-Windows点号绕过
  • kafka-新增topic副本数
  • 【第八节】C++设计模式(结构型模式)-Decorator(装饰器)模式
  • 【Python爬虫(86)】元宇宙浪潮下,Python爬虫能否乘风破浪?
  • python单例模式魔法方法
  • 【Rust中级教程】2.10. API设计原则之受约束性(constrained) Pt.1:对类型进行修改、`#[non_exhaustive]`注解
  • DINOv2 + yolov8 + opencv 检测卡车的可拉拽雨覆是否完全覆盖
  • C++的多态