欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

OpenRTMFP/Cumulus Primer(23)线程逻辑分析之二:RTMFPManager对RTMFPServer的影响

程序员文章站 2022-05-13 16:29:56
...

OpenRTMFP/Cumulus Primer(23)线程逻辑分析之二:RTMFPManager对RTMFPServer的影响

  • 作者:柳大·Poechant(钟超 Michael)
  • 博客:Blog.csdn.net/poechant
  • 邮箱:zhongchao.ustc@gmail.com
  • 日期:August 5th, 2012

RTMFPManagerRTMFPServer同样,继承自Startable

class RTMFPManager : private Task, private Startable

在构造函数中将RTMFPServer对象以引用方式传入,用以初始化其_server引用成员。

RTMFPManager(RTMFPServer& server)
    : _server(server),
      Task(server),
      Startable("RTMFPManager")  {
    start();
}
. . .
RTMFPServer& _server;

RTMFPManager的构造函数中调用start()成员函数,是从Startable继承而来的。然后会开启一个新的名为RTMFPManager的线程。然后响应到RTMFPManager::run()函数。

void run() {
    setPriority(Thread::PRIO_LOW);
    while(sleep(2000)!=STOP)
        waitHandle();
}

这里要强调的是,这里的setPriorityLinux环境下会设置失败,可以参见我在CumulusGithub上开启的Issue #75,其中就包括这里的线程优先级设置。

在这里我们可以看到RTMFPManagerhandle(…)中的sleep(…)是每 2 秒一次,而这是对RTMFPServer线程有影响的。还记得我说的RTMFPServer线程的_wakeUpEvent成员吗?(在《OpenRTMFP/Cumulus Primer(22)RTMFPServer线程的启动和等待》一文中)它的激活就是在RTMFPManager中进行的,所以这里这个 2 秒是会影响到RTMFPServer的主循环的等待时间的。

Startable::WakeUpType Startable::sleep(UInt32 timeout) {
    if(_stop)
        return STOP;
     WakeUpType result = WAKEUP;
     if(timeout>0) {
         if(!_wakeUpEvent.tryWait(timeout))
             result = TIMEOUT;
     } else {
         _wakeUpEvent.wait();
     }
    if(_stop)
        return STOP;
    return result;
}

你可以自行修改RTMFPServersleep(...)的参数,这样就会调用_wakeUpEvent.tryWait(timeout)了,按照指定的等待时间(即timeout)来进行睡眠。

RTMFPManager的作用是什么呢?核心就在于它的handle成员函数:

void handle() {
    _server.manage();
}

这里就会调用到RTMFPServer::manage(),所以你要在阅读RTMFPServer源码时知道RTMFPServer::manage()函数并不是在RTMFPServer线程内运行的,而是RTMFPManager线程内运行的。它的定义如下:

void RTMFPServer::manage() {
    _handshake.manage();
    _sessions.manage();
}

它实现对现有 Session 的一些管理,比如终止已经死掉的 Session。

-

转载请注明来自柳大·Poechant(钟超)的CSDN博客:Blog.CSDN.net/Poechant

-