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

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

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

-

你可能感兴趣的:(OpenRTMFP/Cumulus Primer(23)线程逻辑分析之二:RTMFPManager对RTMFPServer的影响)