nginx的filter模块在处理从别的filter模块或者是handler模块传递过来的数据(实际上就是需要发送给客户端的http response)。这个传递过来的数据是以一个链表的形式(ngx_chain_t)。而且数据可能被分多次传递过来。也就是多次调用filter的处理函数,以不同的ngx_chain_t。

该结构被定义在src/core/ngx_buf.h|c。下面我们来看一下ngx_chain_t的定义。

typedef struct ngx_chain_s       ngx_chain_t;struct ngx_chain_s {ngx_buf_t    *buf;ngx_chain_t  *next;
};

就2个字段,next指向这个链表的下个节点。buf指向实际的数据。所以在这个链表上追加节点也是非常容易,只要把末尾元素的next指针指向新的节点,把新节点的next赋值为NULL即可。

ngx_chain_t *ngx_alloc_chain_link(ngx_pool_t *pool);

该函数创建一个ngx_chain_t的对象,并返回指向对象的指针,失败返回NULL。

#define ngx_free_chain(pool, cl)                                             \cl->next = pool->chain;                                                  \
pool->chain = cl

该宏释放一个ngx_chain_t类型的对象。如果要释放整个chain,则迭代此链表,对每个节点使用此宏即可。

注意: 对ngx_chaint_t类型的释放,并不是真的释放了内存,而仅仅是把这个对象挂在了这个pool对象的一个叫做chain的字段对应的chain上,以供下次从这个pool上分配ngx_chain_t类型对象的时候,快速的从这个pool->chain上取下链首元素就返回了,当然,如果这个链是空的,才会真的在这个pool上使用ngx_palloc函数进行分配。

Nginx基本数据结构之ngx_chain_t相关推荐

  1. Nginx学习笔记(三) Nginx基本数据结构

    话说学习一种编程语言,例如C语言,我们首先学的也是数据结构,这是以后开发程序的关键.为了更好更方便的开发Nginx,Nginx自己实现了很多适合nginx的数据结构. Nginx中的数组 ngx_ar ...

  2. Nginx基本数据结构之ngx_buf_t

    这个ngx_buf_t就是这个ngx_chain_t链表的每个节点的实际数据.该结构实际上是一种抽象的数据结构,它代表某种具体的数据.这个数据可能是指向内存中的某个缓冲区,也可能指向一个文件的某一部分 ...

  3. Nginx基本数据结构之ngx_pool_t

    ngx_pool_t是一个非常重要的数据结构,在很多重要的场合都有使用,很多重要的数据结构也都在使用它.那么它究竟是一个什么东西呢?简单的说,它提供了一种机制,帮助管理一系列的资源(如内存,文件等), ...

  4. Nginx基本数据结构之ngx_hash_keys_arrays_t

    大家看到在构建一个ngx_hash_wildcard_t的时候,需要对通配符的哪些key进行预处理.这个处理起来比较麻烦.而当有一组key,这些里面既有无通配符的key,也有包含通配符的key的时候. ...

  5. nginx基本数据结构ngx_module_t,ngx_module_s

    ngx_module_t是nginx的模块化架构最基本的数据结构.  其结构定义如下,其中的注释为功能说明: struct ngx_module_s { ngx_uint_t            c ...

  6. Nginx基础数据结构分析-ngx_chain_t

    nginx的filter模块在处理从别的filter模块或者是handler模块传递过来的数据(实际上就是需要发送给客户端的http response).这个传递过来的数据是以一个链表的形式(ngx_ ...

  7. Nginx基本数据结构之ngx_hash_t

    ngx_hash_t是nginx自己的hash表的实现.定义和实现位于src/core/ngx_hash.h|c中.ngx_hash_t的实现也与数据结构教课书上所描述的hash表的实现是大同小异.对 ...

  8. Nginx基本数据结构之ngx_str_t

    nginx的作者为追求极致的高效,自己实现了很多颇具特色的nginx风格的数据结构以及公共函数.比如,nginx提供了带长度的字符串,根据编译器选项优化过的字符串拷贝函数ngx_copy等.所以,在我 ...

  9. nginx基本数据结构及接口

    简单的数据类型 在core/ngx_confing.h中定义了基本的数据类型的映射,大部分都映射到c语言自身的数据类型: typedef intptr_t        ngx_int_t; type ...

最新文章

  1. 体系化认识RPC--转
  2. k中心点聚类算法伪代码_聚类算法之——K-Means、Canopy、Mini Batch K-Means
  3. 把普通的git库变成bare库
  4. 【verilog语法】关于testbench与被测module的输入输出数据类型定义:reg/wire原因
  5. IOS 实现TXT文本自动识别编码的方法
  6. mysql 排他,mysql 共享锁 排他锁 防插入锁
  7. oracle sql切换模式,Oracle SQL 模式下命令回退
  8. 【ElasticSearch】ElasticSearch 7.x 默认不在支持指定索引类型 Failed to parse mapping [_doc]: Root mapping definitio
  9. 谈一谈商品编码的问题
  10. 5101是多大的电阻_电阻尺寸对照表
  11. 中国智能经济觉醒,云智一体打造产业智能化加速器
  12. Python信息轰炸
  13. 云服务器无法连接怎么办
  14. 设置linux睡眠时间,Linux 睡眠时间函数如何使用?延迟指定时间sleep命令了解一下...
  15. 基于Amos路径分析的模型修正与调整
  16. 2021年7月程序员工资统计,平均15302元
  17. 这个Q版卡通头像生成器,太符合程序员形象了
  18. 判断清浊音 matlab,基于MATLAB的语音信号的清浊音分析.doc
  19. 2021鹏业安装算量软件常见问题整理(二十)
  20. spring @Value 的取值顺序 优先级

热门文章

  1. python函数库 阶跃 信号函数 调用_有没有大神知道 step2 阶跃响应函数的 里面的T的怎么定义...
  2. hanlp加载预训练模型
  3. python列表注解
  4. Python生成(x,y,z)三维坐标序列
  5. selenium配置无界面chrome浏览器
  6. 大一C语言大作业ip合法性,c语言实现判断ip地址是否合法
  7. 地面波天线怎样能多收台_GPS天线的分类介绍及应用
  8. 从python入门到放弃_《Python3从入门到放弃》视频教程
  9. c语言判断任意位数能否倒序数,C语言求助!一个三位数的逆序数,总是编不对...
  10. Java可以用到军事方面吗_恭喜遥三运载火箭发射成功,浅谈java在军事方面的运用!...