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 顺序),因此销毁时最后注册的清理函数会先执行。
设计意图
资源生命周期管理
通过将资源释放逻辑与内存池绑定,确保资源在内存池销毁时自动释放,避免手动管理导致的内存泄漏或悬空指针。