SRS对StateThreads的封装—SRS源码分析

271 阅读1分钟

SRS 对 StateThreads 的封装都在 srs_app_st.hppsrs_app_st.cpp 里面,这个文件里面的 class 类结构之间的关系如下:

1-1

SrsSTCoroutine 可以说就是 SRS 封装 StateThreads 之后提供的外部接口类。

如果你想创建一个协程服务,首先,你需要让你的类继承 ISrsCoroutineHandler,然后实现自己的 cycle() 方法,他内部最终会创建一个协程来运行你的 cycle() 方法。

以 SrsSignalManager 信号处理模块为例,他的类定义如下:

class SrsSignalManager : public ISrsCoroutineHandler

SrsSignalManager 的 cycle 函数如下:

1-2

不过需要注意的是 SrsSignalManager 并没有继承 SrsSTCoroutineSrsSTCoroutine 是作为 trd 变量在 SrsSignalManager 里面存在的,如下:

1-3

1-4

//创建协程
trd = new SrsSTCoroutine("signal", this, _srs_context->get_id());
//启动协程
trd->start();

上面的 this 就是 SrsSignalManager 本身,这样就把 SrsSignalManager 作为一个 handler 绑定到 SrsFastCoroutine 里面了,最后会启动一个协程执行 this 里面的 cycle() 函数,流程图如下:

1-4-2

1-4-3

1-5

SrsSignalManager 是一个比较好的示例模块,代码比较短,如果你想创建一个新的模块,可以把 SrsSignalManager 复制一份来修改。


本文的第一张图片里面有一个 SrsDummyCoroutine 类,SrsDummyCoroutine 的设计有点不太好理解,其实他使用的是 empty object 设计模式,就是一个空的对象,里面的 start()stop() 等函数都是空的。

以 HTTP API 模块为例,他的用法如下:

1-6

其实跟之前的区别就是, new SrsDummyCoroutine 变成了 new SrsSTCoroutine。但是这个 SrsDummyCoroutine 实例最后是会被释放的,然后重新用 SrsSTCoroutine 实例来替代的,如下:

1-7

SrsDummyCoroutine 应该是在某些动态创建协程的场景有用,这部分内容后面再继续补充。


本文是《  SRS原理  》一书中的文章,如需观看更多内容,请购买本书。