博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
nginx菜鸟模块开发遇到的问题汇总之nginx_array_t
阅读量:4348 次
发布时间:2019-06-07

本文共 1751 字,大约阅读时间需要 5 分钟。

关于ngx_array_t结构体的定义和操作函数都在ngx_array.h/ngx_array.c文件中

1 struct ngx_array_s {2     void        *elts; //数组数据区起始位置3     ngx_uint_t   nelts; //实际存放的元素个数4     size_t       size; //每个元素大小5     ngx_uint_t   nalloc; //数组所含的空间个数,即可容纳的最大的原书数目6     ngx_pool_t  *pool; //该数组在内存池中的分配7 };

 

数组操作共有5个::

1 ngx_array_t *ngx_array_create(ngx_pool_t *p, ngx_uint_t n, size_t size); //创建ngx_array2 void ngx_array_destroy(ngx_array_t *a); //删除或回收3 void *ngx_array_push(ngx_array_t *a); //向数组添加元素4 void *ngx_array_push_n(ngx_array_t *a, ngx_uint_t n); //向数组添加n个元素5 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 *ngx_array_create(ngx_pool_t *p, ngx_uint_t n, size_t size) {
  从存储池p中,分配n*size的空间;   etls指向了分配空间的首地址;   初始化ngx_array_t相关元素:   nelts = 0;//没有元素,或者也可以理解为,当前可以使用数组空间的下标   a - > size =size;元素size   nalloc = n ;数组可容纳元素的个数   pool = p;数组所在的存储池 } ngx_array_init与ngx_array_create不同之处在,init不需要为ngx_array_t本身分配空间。 void * ngx_array_push(ngx_array_t *a); 从数组a中取一个元素的空间,将元素空间地址返回; 如果数组已经满了,则继续从数组a的内存池中分配存储空间,这里分为两种情况: 1. 如果数组位于内存池的尾部,则继续分配一个元素的空间,返回;//这是因为能够保证新分配的元素与原始的数组空间是连续的 2. 如果数组不是位于内存池尾部,则重新分配2倍的存储空间,将原来的数组元素拷贝到新的分配空间中
ngx_array_push源码
ngx_array_push_n源码

ngx_array_push_n处理过程与ngx_array_push类似,不同之处仅在于需要分配连续n个数组元素的空间;

 

ngx_array_destroy回收数组a的空间,仅当数组位于p的尾部时才会回收;//ngx_pool的具体回收机制,需要研读相关代码部分才可知。

1 void ngx_array_destroy(ngx_array_t *a) 2 { 3     ngx_pool_t  *p; 4  5     p = a->pool; 6  7     if ((u_char *) a->elts + a->size * a->nalloc == p->d.last) { 8         p->d.last -= a->size * a->nalloc; 9     }10 11     if ((u_char *) a + sizeof(ngx_array_t) == p->d.last) {12         p->d.last = (u_char *) a;13     }14 }

 

 

转载于:https://www.cnblogs.com/remimin/archive/2012/06/08/2541331.html

你可能感兴趣的文章
Day4-文件,json字典文件互转,函数
查看>>
.Net core 使用Jenkins + Docker + Azure Devops 持续部署(CI/CD)
查看>>
iOS_SN_UITableView的优化
查看>>
vector引用参数
查看>>
[转载]typedef 的用法
查看>>
NTC温度采集之数据拟合——freemat软件实现
查看>>
maven私服nexus3.9安装配置
查看>>
U盘出现大量乱码文件,并且不能彻底删除
查看>>
UEditor添加一个普通按钮及其他使用注意事项
查看>>
C语言的第一次实验报告
查看>>
spring JDBC 批量插入数据
查看>>
状态压缩题目小结
查看>>
Android WebView 开发具体解释(三)
查看>>
2016-2017-2 20155325实验二《Java面向对象程序设计》实验报告
查看>>
POJ.3145.Common Substrings(后缀数组 倍增 单调栈)
查看>>
BZOJ.1935.[SHOI2007]Tree园丁的烦恼(CDQ分治 三维偏序)
查看>>
c++可变参数(示例)
查看>>
4923: [Lydsy1706月赛]K小值查询 平衡树 非旋转Treap
查看>>
MySQL 配置文件详解
查看>>
maven 中央仓库地址
查看>>