ngx_create_pool
声明在 src\core\ngx_palloc.h 中
ngx_pool_t *ngx_create_pool(size_t size, ngx_log_t *log);
实现在 src\core\ngx_palloc.c 中
ngx_pool_t * ngx_create_pool(size_t size, ngx_log_t *log) {ngx_pool_t *p;p = ngx_memalign(NGX_POOL_ALIGNMENT, size, log);if (p == NULL) {return NULL;}p->d.last = (u_char *) p + sizeof(ngx_pool_t);p->d.end = (u_char *) p + size;p->d.next = NULL;p->d.failed = 0;size = size - sizeof(ngx_pool_t);p->max = (size < NGX_MAX_ALLOC_FROM_POOL) ? size : NGX_MAX_ALLOC_FROM_POOL;p->current = p;p->chain = NULL;p->large = NULL;p->cleanup = NULL;p->log = log;return p; }
函数签名
ngx_pool_t *ngx_create_pool(size_t size, ngx_log_t *log)
- 功能 :创建一个大小为
size
的内存池,并返回指向该内存池的指针。- 参数 :
size
:指定内存池的总大小。log
:日志对象,用于记录错误信息。- 返回值 :成功时返回指向内存池的指针,失败时返回
NULL
。
定义局部变量
ngx_pool_t *p;
- 定义一个指针变量
p
,用于存储新创建的内存池对象的地址。
分配内存
p = ngx_memalign(NGX_POOL_ALIGNMENT, size, log); if (p == NULL) {return NULL; }
调用
ngx_memalign
函数分配一块对齐的内存,大小为size
,对齐方式为NGX_POOL_ALIGNMENT
。如果分配失败(返回
NULL
),直接返回NULL
,表示内存池创建失败。
ngx_memalign
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_memalign函数-CSDN博客
NGX_POOL_ALIGNMENT
定义在 src\core\ngx_palloc.h
#define NGX_POOL_ALIGNMENT 16
初始化内存池的
d
域p->d.last = (u_char *) p + sizeof(ngx_pool_t); p->d.end = (u_char *) p + size; p->d.next = NULL; p->d.failed = 0;
p->d.last
:指向当前内存池中可用内存的起始位置,初始值为p
加上sizeof(ngx_pool_t)
,即跳过内存池头部结构体。p->d.end
:指向内存池的末尾,初始值为p + size
。p->d.next
:指向下一个内存池块,默认初始化为NULL
。p->d.failed
:记录分配失败的次数,初始值为0
。Ubuntu 下 nginx-1.24.0 源码分析 - ngx_pool_t 类型-CSDN博客
计算最大分配大小
size = size - sizeof(ngx_pool_t); p->max = (size < NGX_MAX_ALLOC_FROM_POOL) ? size : NGX_MAX_ALLOC_FROM_POOL;
size
减去sizeof(ngx_pool_t)
,得到实际可用于分配的内存大小。将
p->max
设置为较小值:size
或NGX_MAX_ALLOC_FROM_POOL
。
p->max
表示从内存池中分配的最大块大小。如果请求的内存超过
p->max
,则会使用大块内存分配机制(见后续的large
字段)。
NGX_MAX_ALLOC_FROM_POOL
Ubuntu 下 nginx-1.24.0 源码分析 - NGX_MAX_ALLOC_FROM_POOL-CSDN博客
初始化其他字段
p->current = p; p->chain = NULL; p->large = NULL; p->cleanup = NULL; p->log = log;
p->current
:指向当前正在使用的内存池块,初始值为p
。p->chain
:指向内存池链表,默认初始化为NULL
。p->large
:指向大块内存分配链表,默认初始化为NULL
。p->cleanup
:指向清理回调函数链表,默认初始化为NULL
。p->log
:保存日志对象,用于记录错误信息。
返回内存池指针
return p;
- 返回指向新创建的内存池对象的指针。