Chinaunix首页 | 论坛 | 博客
  • 博客访问: 871365
  • 博文数量: 87
  • 博客积分: 3324
  • 博客等级: 中校
  • 技术积分: 1003
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-17 11:37
文章分类

全部博文(87)

文章存档

2014年(3)

2013年(5)

2012年(21)

2011年(13)

2010年(7)

2009年(9)

2008年(4)

2007年(14)

2006年(11)

分类: C/C++

2012-10-31 11:15:31

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

 

该结构被定义在src/core/ngx_buf.h|c。下面我们来看一下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函数进行分配。

Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority:99; mso-style-qformat:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.5pt; mso-bidi-font-size:11.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt;}
阅读(4463) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~