Ubuntu 下 nginx-1.24.0 源码分析 - ngx_array_init 函数

发布于:2025-02-23 ⋅ 阅读:(13) ⋅ 点赞:(0)
ngx_array_init

定义在 src/core/ngx_array.h

static ngx_inline ngx_int_t
ngx_array_init(ngx_array_t *array, ngx_pool_t *pool, ngx_uint_t n, size_t size)
{
    /*
     * set "array->nelts" before "array->elts", otherwise MSVC thinks
     * that "array->nelts" may be used without having been initialized
     */
    array->nelts = 0;
    array->size = size;
    array->nalloc = n;
    array->pool = pool;
 
    array->elts = ngx_palloc(pool, n * size);
    if (array->elts == NULL) {
        return NGX_ERROR;
    }
 
    return NGX_OK;
}

ngx_array_init 函数的作用

ngx_array_init 是一个静态内联函数,用于初始化一个 ngx_array_t 对象。它的主要任务是:

  1. 设置数组的基本属性(如元素大小、预分配数量等)。
  2. 分配内存以存储数组元素。
  3. 返回初始化是否成功的状态。

函数签名

static ngx_inline ngx_int_t
ngx_array_init(ngx_array_t *array, ngx_pool_t *pool, ngx_uint_t n, size_t size)

参数解析

ngx_array_t *array

作用 :指向需要初始化的动态数组对象。

调用者需要提供一个已经分配好的 ngx_array_t 对象

函数会填充该对象的各个字段,完成初始化

ngx_pool_t *pool

作用 :指定用于分配内存的 Nginx 内存池。

Nginx 使用内存池机制来管理内存,pool 是内存池的核心对象。

数组元素的存储空间将从这个内存池中分配。

ngx_uint_t n

作用 :指定数组的初始容量,即预分配的元素数量。

n 表示数组最多可以存储多少个元素。

如果实际存储的元素数量超过 n,则需要扩容

size_t size

作用 :指定数组中每个元素的大小(单位为字节)。

size 通常是通过 sizeof 计算得出的类型大小。

函数会根据 sizen 计算出需要分配的总内存大小(n * size)。

返回值类型 ngx_int_t

NGX_OK :表示初始化成功。

NGX_ERROR :表示初始化失败。

如果内存分配成功且所有字段都正确初始化,则返回 NGX_OK

如果内存分配失败(ngx_palloc 返回 NULL),则返回 NGX_ERROR

 

array->nelts = 0;

 将 nelts 设置为 0,表示当前数组中还没有存储任何元素


ngx_array_t

typedef struct {
    void        *elts;     // 指向数组元素的内存块
    ngx_uint_t   nelts;    // 当前数组中已存储的元素数量
    size_t       size;     // 每个元素的大小(单位为字节)
    ngx_uint_t   nalloc;   // 数组预分配的元素数量
    ngx_pool_t  *pool;     // 内存池指针,用于分配内存
} ngx_array_t;
  • elts :指向实际存储数组元素的内存区域。
  • nelts :记录当前数组中已经存储的元素数量。
  • size :每个元素的大小,通常通过 sizeof 计算得出。
  • nalloc :数组预分配的空间大小,表示最多可以存储多少个元素。
  • pool :Nginx 的内存池对象,用于管理内存分配和释放。

ngx_array_t 的设计充分利用了 Nginx 的内存池机制,避免了频繁的内存分配和释放操作,从而提高了性能。

 

    array->size = size;

size 参数赋值给 array->size,表示数组中每个元素的大小

    array->nalloc = n;

 将 n 参数赋值给 array->nalloc,表示数组预分配的元素数量

    array->pool = pool;

 将 pool 参数赋值给 array->pool,表示数组使用的内存池

    array->elts = ngx_palloc(pool, n * size);

 作用 :调用 ngx_palloc 函数,从内存池中分配一块大小为 n * size 的连续内存,并将其地址赋值给 array->elts

n * size 表示需要分配的总内存大小。

ngx_palloc 是 Nginx 内存池的核心函数,用于从内存池中分配内存。

    if (array->elts == NULL) {
        return NGX_ERROR;
    }

 作用 :检查 array->elts 是否为 NULL,如果是,则返回 NGX_ERROR 表示初始化失败。

如果内存分配失败,数组无法正常工作,因此需要立即终止初始化过程。

返回 NGX_ERROR 可以让调用者知道初始化失败的原因。

    return NGX_OK;
}
作用 :如果所有步骤都成功执行,则返回 NGX_OK 表示初始化完成。