diff --git a/trunk/src/app/srs_app_hybrid.cpp b/trunk/src/app/srs_app_hybrid.cpp index 313c5e0c8..cd8147327 100644 --- a/trunk/src/app/srs_app_hybrid.cpp +++ b/trunk/src/app/srs_app_hybrid.cpp @@ -98,6 +98,10 @@ srs_error_t SrsServerAdapter::run() return err; } +void SrsServerAdapter::stop() +{ +} + SrsHybridServer::SrsHybridServer() { } @@ -168,5 +172,14 @@ srs_error_t SrsHybridServer::run() return err; } +void SrsHybridServer::stop() +{ + vector::iterator it; + for (it = servers.begin(); it != servers.end(); ++it) { + ISrsHybridServer* server = *it; + server->stop(); + } +} + SrsHybridServer* _srs_hybrid = new SrsHybridServer(); diff --git a/trunk/src/app/srs_app_hybrid.hpp b/trunk/src/app/srs_app_hybrid.hpp index 58aa6dff9..383456660 100644 --- a/trunk/src/app/srs_app_hybrid.hpp +++ b/trunk/src/app/srs_app_hybrid.hpp @@ -30,16 +30,22 @@ class SrsServer; +// The hibrid server interfaces, we could register many servers. class ISrsHybridServer { public: ISrsHybridServer(); virtual ~ISrsHybridServer(); public: + // Only ST initialized before each server, we could fork processes as such. virtual srs_error_t initialize() = 0; + // Run each server, should never block except the SRS master server. virtual srs_error_t run() = 0; + // Stop each server, should do cleanup, for example, kill processes forked by server. + virtual void stop() = 0; }; +// The SRS server adapter, the master server. class SrsServerAdapter : public ISrsHybridServer { private: @@ -50,8 +56,10 @@ public: public: virtual srs_error_t initialize(); virtual srs_error_t run(); + virtual void stop(); }; +// The hybrid server manager. class SrsHybridServer { private: @@ -64,6 +72,7 @@ public: public: virtual srs_error_t initialize(); virtual srs_error_t run(); + virtual void stop(); }; extern SrsHybridServer* _srs_hybrid; diff --git a/trunk/src/main/srs_main_server.cpp b/trunk/src/main/srs_main_server.cpp index d3c527761..76ce742f7 100644 --- a/trunk/src/main/srs_main_server.cpp +++ b/trunk/src/main/srs_main_server.cpp @@ -420,14 +420,19 @@ srs_error_t run_hybrid_server() _srs_hybrid->register_server(new SrtServerAdapter()); #endif + // Do some system initialize. if ((err = _srs_hybrid->initialize()) != srs_success) { return srs_error_wrap(err, "hybrid initialize"); } + // Should run util hybrid servers all done. if ((err = _srs_hybrid->run()) != srs_success) { return srs_error_wrap(err, "hybrid run"); } + // After all done, stop and cleanup. + _srs_hybrid->stop(); + return err; } diff --git a/trunk/src/srt/srt_server.cpp b/trunk/src/srt/srt_server.cpp index e518385a8..d7212c6a5 100644 --- a/trunk/src/srt/srt_server.cpp +++ b/trunk/src/srt/srt_server.cpp @@ -211,6 +211,9 @@ SrtServerAdapter::~SrtServerAdapter() srs_error_t SrtServerAdapter::initialize() { srs_error_t err = srs_success; + + // TODO: FIXME: We could fork processes here, because here only ST is initialized. + return err; } @@ -218,6 +221,8 @@ srs_error_t SrtServerAdapter::run() { srs_error_t err = srs_success; + // TODO: FIXME: We could start a coroutine to dispatch SRT task to processes. + if(_srs_config->get_srt_enabled()) { srs_trace("srt server is enabled..."); unsigned short srt_port = _srs_config->get_srt_listen_port(); @@ -242,3 +247,8 @@ srs_error_t SrtServerAdapter::run() return err; } + +void SrtServerAdapter::stop() +{ + // TODO: FIXME: If forked processes, we should do cleanup. +} diff --git a/trunk/src/srt/srt_server.hpp b/trunk/src/srt/srt_server.hpp index d235dfad6..27bb3bdfb 100644 --- a/trunk/src/srt/srt_server.hpp +++ b/trunk/src/srt/srt_server.hpp @@ -47,6 +47,7 @@ public: public: virtual srs_error_t initialize(); virtual srs_error_t run(); + virtual void stop(); }; #endif//SRT_SERVER_H \ No newline at end of file