ngx_palloc_small
声明在 src\core\ngx_palloc.c
static ngx_inline void *ngx_palloc_small(ngx_pool_t *pool, size_t size, ngx_uint_t align);
定义在 src\core\ngx_palloc.c
static ngx_inline void * ngx_palloc_small(ngx_pool_t *pool, size_t size, ngx_uint_t align) { u_char *m; ngx_pool_t *p; p = pool->current; do { m = p->d.last; if (align) { m = ngx_align_ptr(m, NGX_ALIGNMENT); } if ((size_t) (p->d.end - m) >= size) { p->d.last = m + size; return m; } p = p->d.next; } while (p); return ngx_palloc_block(pool, size); }
函数原型与参数说明
static ngx_inline void * ngx_palloc_small(ngx_pool_t *pool, size_t size, ngx_uint_t align)
pool
:指向当前内存池的指针。size
:需要分配的内存大小。align
:是否需要进行内存对齐。如果为非零值,则会对分配的内存地址进行对齐。返回值是一个指向分配内存的指针,或者在分配失败时返回
NULL
。
初始化局部变量
u_char *m; ngx_pool_t *p;
m
是一个指针,用于记录当前尝试分配的内存地址。p
是一个指向内存池块的指针,用于遍历内存池链表。
获取当前内存池块
p = pool->current;
pool->current
是内存池中当前正在使用的块。- 这里将
p
初始化为当前块,表示从当前块开始尝试分配内存
开始循环遍历内存池块
do { ... } while (p);
- 使用
do-while
循环遍历内存池的所有块。- 如果当前块无法满足分配需求,则尝试下一个块
获取当前块的剩余空间起始地址
m = p->d.last;
p->d.last
是当前块中已分配内存的末尾地址。- 将
m
设置为该地址,表示从这里开始尝试分配新的内存
检查是否需要对齐
if (align) { m = ngx_align_ptr(m, NGX_ALIGNMENT); }
- 如果
align
参数为非零值,则调用ngx_align_ptr
对m
进行对齐。NGX_ALIGNMENT
是 Nginx 中定义的对齐常量,为 16 字节。
ngx_align_ptr
检查剩余空间是否足够
if ((size_t) (p->d.end - m) >= size) { p->d.last = m + size; return m; }
p->d.end
是当前块的结束地址。(p->d.end - m)
表示当前块的剩余可用空间大小。- 如果剩余空间大于等于请求的
size
,则:
- 更新
p->d.last
,将其移动到新分配内存的末尾。- 返回分配的内存地址
m
尝试下一个内存块
p = p->d.next;
- 如果当前块无法满足分配需求,则通过
p->d.next
移动到下一个内存块。- 继续循环,直到找到合适的块或遍历完所有块。
分配新的内存块
return ngx_palloc_block(pool, size);
- 如果遍历完所有现有块仍然无法满足分配需求,则调用
ngx_palloc_block
函数创建一个新的内存块。ngx_palloc_block
会分配一块更大的内存,并将其链接到内存池链表中。
ngx_palloc_block
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_palloc_block函数-CSDN博客