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;
- 返回指向新創建的內存池對象的指針。