void
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;
}

ngx_rtmp_shared模块对ngx_chain_t的操作总结相关推荐

  1. Winform开发框架中工作流模块之审批会签操作

    在前面介绍了框架中工作流的几个开发过程,本篇随笔重点介绍一下日常审批环节中的具体处理过程,从开始创建表单,以及各个审批.会签过程的流转过程,希望大家对其中流程的处理有一个大概的印象. 1.请假申请表单 ...

  2. python 文件操作的模块_Python之文件操作修改模块

    1.使用OS模块进行path路径操作 操作的语法为os.path.方法名(): import os # 首先导入os模块 *abspath()方法:获取当前文件的全路径,所带参数为file: file ...

  3. python 中文件输入输出及os模块对文件系统的操作

    整理了一下python 中文件的输入输出及主要介绍一些os模块中对文件系统的操作. 文件输入输出 1.内建函数open(file_name,文件打开模式,通用换行符支持),打开文件返回文件对象. 2. ...

  4. boost::mpi模块非阻塞点对点操作的测试

    boost::mpi模块非阻塞点对点操作的测试 实现功能 C++实现代码 实现功能 boost::mpi模块非阻塞点对点操作的测试 C++实现代码 #include <boost/mpi/non ...

  5. python jsonpath-rw_Python使用jsonpath-rw模块处理Json对象操作示例

    本文实例讲述了Python使用jsonpath-rw模块处理Json对象操作.分享给大家供大家参考,具体如下: 这两天在写一个爬虫,需要从网站返回的json数据提取一些有用的数据. 向url发起请求, ...

  6. nodejs01——安装及使用、服务端及客户端、commonjs规范、fs模块的使用(文件操作及目录操作)、stream、buffer、WebServer、端口、动态资源及静态资源、头信息、请求方式

    nodejs的安装及使用 服务端及客户端 commonjs规范 fs模块的使用(文件操作及目录操作) stream buffer // Node.js介绍 Node.js 诞生于2009年,Node. ...

  7. 用keyboard模块模拟记录键盘操作

    用keyboard模块模拟记录键盘操作 介绍的是keyboard这个模块 该模块的特征: 所有键盘事件上的全局hook (无论焦点如何都捕获键). 监听并发送键盘事件 纯Python,不需要编译c模块 ...

  8. 想知道自己的某个内存的小视频总时长?那这篇CSDN很适合你,快来看看Python如何实现求MP4时长吧(包含os模块和moviepy模块的全套基础操作)

    今天我们就来看看哪个老司机的视频时长最长,嘿嘿嘿,废话不多说,任何内容都瞒不住咱的程序,包含os模块和moviepy模块的全套基础操作哦!我们直接开始! 老司机求视频时长 一.我们需要的模块与包的使用 ...

  9. 下载perl的mysql模块_安装用于操作MySQL的Perl模块

    在我使用Webmin(version 1.480)管理FreeBSD主机上的MySQL数据库服务器时出现: "警告:您的系统未安装Perl 模块 DBI 和 DBD::mysql,Webmi ...

最新文章

  1. Lesson 6.1 身份证识别: 提取字段
  2. 虚拟机网络设置方法——转载
  3. linux查看 idt日志,实现RCP的日志管理
  4. BZOJ 1717 [Usaco2006 Dec]Milk Patterns 产奶的模式(后缀数组)
  5. JS——实现短信验证码的倒计时功能(没有验证码,只有倒计时)
  6. MySQL基础(二)数据库、表的创建及操作
  7. 图像语义分割 -- FCN
  8. JS面试之对象(2)
  9. 布局时margin会影响父元素
  10. sql 运算符_了解SQL ANY和ALL运算符
  11. 音频功率放大器,250种功放电路图集锦,文件是JPG文件
  12. 欠四大银行信用卡不还,最终会怎么样?
  13. 学python之前先掌握-成为黑客前,你首先应该掌握的Python技术
  14. BOOT客户管理系统(详解)
  15. css 剪辑图片_css实现图片剪裁
  16. pycharm跑程序时出现Process finished with exit code -1073740791 (0xC0000409)
  17. 计算机保密dss是啥,什么是DSS?
  18. 设置elment ui plus 的el table的边框线
  19. [RK3288][Android6.0] WiFi的dts配置说明(AP6335)
  20. arctoolbox工具

热门文章

  1. IOS Unit test
  2. POJ-3070 Fibonacci 快速矩阵幂
  3. Python 3.2 beta 2 发布
  4. POJ - 1655 Balancing Act(树的重心)
  5. kafka 丢弃数据_kafka 生产者和幂等
  6. RelationTrack解读
  7. 数据科学竞赛-文本分类
  8. linux源码安装必备条件,玩转Linux必备的金钥匙之源码安装mysql
  9. 实验一线性表的基本操作实现及其应用(JavaScript实现)
  10. NEFU 635(二分+枚举)