OpenRTMFP/Cumulus Primer(7)CumulusServer 啟動流程分析(續3)

鍾超發表於2012-08-02

OpenRTMFP/Cumulus Primer(7)CumulusServer 啟動流程分析(續3)

  • 作者:柳大·Poechant(鍾超)
  • 部落格:Blog.CSDN.net/Poechant
  • 郵箱:zhongchao.ustc#gmail.com (# -> @)
  • 日期:April 14th, 2012

1 回顧一下啟動過程

  1. 從 main.cpp 的啟動入口main()函式開始,建立Server物件並啟動(呼叫start()函式)。
  2. Server::start()中呼叫其父類(RTMFPServer)的父類(Startable)的方法Startable::start()開啟執行緒。
  3. 呼叫Startable::start()函式後,開啟線城時傳入的引數為*this,所以就會執行Startable::run()

2 RTMFPServer::prerun()

Startable::run()呼叫Startable::prerun()函式,但這個函式被RTMFPServer覆蓋,所以會執行 RTMFPServer::prerun(),其原始碼如下:

bool RTMFPServer::prerun() {
    NOTE("RTMFP server starts on %u port",_port);

如果CumulusEdge

    if (_edgesPort>0)
        NOTE("RTMFP edges server starts on %u port",_edgesPort);

    bool result = true;
    try {
        onStart();

執行執行緒:

        result = Startable::prerun();

處理異常:

    } catch(Exception& ex) {
        FATAL("RTMFPServer : %s",ex.displayText().c_str());
    } catch (exception& ex) {
        FATAL("RTMFPServer : %s",ex.what());
    } catch (...) {
        FATAL("RTMFPServer unknown error");
    }

如果跳出了,則終止執行:

    onStop();

    NOTE("RTMFP server stops");
    return result;
}

該函式內部又會呼叫父類的 Startable::prerun() 函式,該函式呼叫:

virtual void Startable::run(const volatile bool& terminate) = 0;

它是一個純虛擬函式,由 RTMFPServer 實現。

3 Startable::prerun()

Startable::prerun()會呼叫void run(const volatile bool& terminate)方法,該方法被RTMFPServer覆蓋了。

bool Startable::prerun() {
    run(_terminate);
    return !_terminate;
}

4 RTMFPServer::run(const volatile bool& terminate)

RTMFPServer覆蓋Startablerun(const volatile bool &terminate)方法。

void RTMFPServer::run(const volatile bool& terminate) {
    ...
}

-

轉載請註明來自柳大的CSDN部落格:Blog.CSDN.net/Poechant

-

相關文章