当前位置: 首页 > article >正文

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

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 表示初始化完成。


http://www.kler.cn/a/558469.html

相关文章:

  • 深度学习课程作业(Week1)
  • Websocket——心跳检测
  • 【愚公系列】《Python网络爬虫从入门到精通》027-初识Pandas和Series对象
  • 【Bert】自然语言(Language Model)入门之---Bert
  • C++学习笔记第一天(vs工程创建+基本知识)
  • 基于ffmpeg+openGL ES实现的视频编辑工具-环境搭建(三)
  • C++ 模板初阶
  • Cesium开发--自定义Primitive实现3D Gaussian Splatting渲染
  • 学习数据结构(11)二叉树(堆)下
  • 【目标检测】【YOLOv12】YOLOv12:Attention-Centric Real-Time Object Detectors
  • Jenkins 视图(View)
  • Python爬虫系列教程之第十三篇:构建高可用爬虫系统 —— 混合架构与自动化监控
  • TCP...
  • 量化自学 - 金融理论与python - Net Present Value 净现值
  • 智能自动化新纪元:AI与UiPath RPA的协同应用场景与技术实践
  • 【Python爬虫(42)】分布式爬虫:规模扩展与稳健维护之道
  • vue组件,父子通信,路由,异步请求后台接口,跨域
  • Spring Boot 中事务的用法详解
  • 【操作幂等和数据一致性】保障业务在MySQL和COS对象存储的一致
  • 乐享数科:供应链金融—三个不同阶段的融资模式