剩下的就是如何实现chain,chain其实也就是多个buf组合而成的,它主要是用来缓存一些未发出去的,或者接受buf以及writev以及readv而存在的。
buf的实现其实就是一个单链表。这里取得一个chain后直接返回供给其他模板使用。
说明:单独创建缓冲区ngx_buf_t是没办法形成回收和管理机制的,所以需要创建ngx_chain_t缓冲区链表结构,用来管理整个缓冲区。
具体代码如下:
ngx_chain_t * ngx_alloc_chain_link(ngx_pool_t *pool)
{
ngx_chain_t *cl;
///取得pool的老的chain
/*
首先从内存池中去取ngx_chain_t,被清空的ngx_chain_t结构都会放在pool->chain缓冲链上。
*/
cl = pool->chain;
///如果chain已经存在,则直接返回这个chain,然后从pool的chain中删除这个chain。
if (cl) {
pool->chain = cl->next;
return cl;
}
///否则从内存池重新new一个chain。这里注意新建的这个chain是链接到pool的chain上的。
cl = ngx_palloc(pool, sizeof(ngx_chain_t));
if (cl == NULL) {
return NULL;
}
///然后返回
return cl;
}