ngx_rtmp_shared模块对ngx_chain_t的操作总结
ngx_rtmp_free_shared_chain(ngx_rtmp_core_srv_conf_t *cscf, ngx_chain_t *in)
{
? ? ngx_chain_t ? ? ? ?*cl;
//如果引用計數(shù)不為0,返回
? ? if (ngx_rtmp_ref_put(in)) {
? ? ? ? return;
? ? }
//如果引用計數(shù)為0 的,將當(dāng)前chain放到需要釋放的鏈表當(dāng)中,下次循環(huán)利用
? ? 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的數(shù)據(jù)并沒有做任何處理,現(xiàn)在cscf->free?頭結(jié)點中可以認為是已經(jīng)被寫入值的
為了保證下次從free鏈表中分配的內(nèi)存為空,ngx_rtmp_alloc_shared_buf 使用了ngx_pcalloc 對分配的內(nèi)存進行了清零操作
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;
// 對新分配的內(nèi)存進行清零
? ? ? ? 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! */
//引用計數(shù)設(shè)為1
? ? ngx_rtmp_ref_set(out, 1);
? ? return out;
}
總結(jié)
以上是生活随笔為你收集整理的ngx_rtmp_shared模块对ngx_chain_t的操作总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HLS 协议
- 下一篇: TCP/IP详解--TIME_WAIT状