Nginx源码分析(2)

Nginx有很多封装好的内部结构,实现诸如数组、链表、队列、哈希表等这样的容器。和STL一样,它们定义了自己的逻辑、功能及API。


ngx_array_t数组

ngx_array_t是nginx内部封装的使用ngx_pool_t对内存池进行分配的数组容器,其中的数据是在一整片内存区中连续存放的。更新数组时只能在尾部压入1个或多个元素,定义在nginx/src/core/ngx_array.h中。

其中elts指向数组元素所在的内存地址,nelts为实际元素个数,size是单个元素大小,nalloc为数组容量。

pool指向要使用的实例化的内存池。

  • 创建ngx_array_t数组

a是一个nginx数组指针,使用p指向的内存池分配内存。

传进去实例化的内存池p、数组大小n和单个元素大小size。使用ngx_array_init来初始化数组,其中array->elts指向使用内存池p分配n * size大小的内存。

图示如下:

Nginx源码分析(2)

  • 删除ngx_array_t数组

数组删除分为两步,第一个if中将标示数组空内存起始地址的last更新到上图的data(m)结尾;第二个if中将last更新到上图的ngx_pool_t结尾。

  • ngx_array_push增加元素

数组使用方法如下:

ngx_array_push(arr)在数组arr上新追加一个元素,并返回指向新元素的指针(ele)。需要把返回的指针使用类型转换,转换为具体的类型,然后再给新元素赋值*ele = n

0

发表评论

邮箱地址不会被公开。