ngx_rtmp_free_shared_chain(ngx_rtmp_core_srv_conf_t *cscf, ngx_chain_t *in)
{
ngx_chain_t *cl;
//如果引用计数不为0,返回
if (ngx_rtmp_ref_put(in)) {
return;
}
//如果引用计数为0 的,将当前chain放到需要释放的链表当中,下次循环利用
for (cl = in; ; cl = cl->next) {
if (cl->next == NULL) {
cl->next = cscf->free;
cscf->free = in;
return;
}
}
}
注意一点的是, ngx_rtmp_free_shared_chain 只是将in挂载到了cscf->free, 对in链表中buf的数据并没有做任何处理,现在cscf->free 头结点中可以认为是已经被写入值的
为了保证下次从free链表中分配的内存为空,ngx_rtmp_alloc_shared_buf 使用了ngx_pcalloc 对分配的内存进行了清零操作
ngx_chain_t *
ngx_rtmp_alloc_shared_buf(ngx_rtmp_core_srv_conf_t *cscf)
{
u_char *p;
ngx_chain_t *out;
ngx_buf_t *b;
size_t size;
if (cscf->free) {
out = cscf->free;
cscf->free = out->next;
} else {
size = cscf->chunk_size + NGX_RTMP_MAX_CHUNK_HEADER;
// 对新分配的内存进行清零
p = ngx_pcalloc(cscf->pool, NGX_RTMP_REFCOUNT_BYTES
+ sizeof(ngx_chain_t)
+ sizeof(ngx_buf_t)
+ size);
if (p == NULL) {
return NULL;
}
p += NGX_RTMP_REFCOUNT_BYTES;
out = (ngx_chain_t *)p;
p += sizeof(ngx_chain_t);
out->buf = (ngx_buf_t *)p;
p += sizeof(ngx_buf_t);
out->buf->start = p;
out->buf->end = p + size;
}
out->next = NULL;
b = out->buf;
b->pos = b->last = b->start + NGX_RTMP_MAX_CHUNK_HEADER;
b->memory = 1;
/* buffer has refcount =1 when created! */
//引用计数设为1
ngx_rtmp_ref_set(out, 1);
return out;
}