diff --git a/trunk/src/app/srs_app_config.cpp b/trunk/src/app/srs_app_config.cpp index f63c3a07c..30e987ec7 100644 --- a/trunk/src/app/srs_app_config.cpp +++ b/trunk/src/app/srs_app_config.cpp @@ -1540,6 +1540,11 @@ srs_error_t SrsConfig::reload_conf(SrsConfig* conf) if ((err = reload_http_stream(old_root)) != srs_success) { return srs_error_wrap(err, "http steram");; } + + // Merge config: rtc_server + if ((err = reload_rtc_server(old_root)) != srs_success) { + return srs_error_wrap(err, "http steram");; + } // TODO: FIXME: support reload stream_caster. @@ -1697,6 +1702,40 @@ srs_error_t SrsConfig::reload_http_stream(SrsConfDirective* old_root) return err; } +srs_error_t SrsConfig::reload_rtc_server(SrsConfDirective* old_root) +{ + srs_error_t err = srs_success; + + // merge config. + std::vector::iterator it; + + // state graph + // old_rtc_server new_rtc_server + // ENABLED => ENABLED (modified) + + SrsConfDirective* new_rtc_server = root->get("rtc_server"); + SrsConfDirective* old_rtc_server = old_root->get("rtc_server"); + + // TODO: FIXME: Support disable or enable reloading. + + // ENABLED => ENABLED (modified) + if (get_rtc_server_enabled(old_rtc_server) && get_rtc_server_enabled(new_rtc_server) + && !srs_directive_equals(old_rtc_server, new_rtc_server) + ) { + for (it = subscribes.begin(); it != subscribes.end(); ++it) { + ISrsReloadHandler* subscribe = *it; + if ((err = subscribe->on_reload_rtc_server()) != srs_success) { + return srs_error_wrap(err, "rtc server enabled"); + } + } + srs_trace("reload rtc server success."); + return err; + } + + srs_trace("reload rtc server success, nothing changed."); + return err; +} + srs_error_t SrsConfig::reload_transcode(SrsConfDirective* new_vhost, SrsConfDirective* old_vhost) { srs_error_t err = srs_success; diff --git a/trunk/src/app/srs_app_config.hpp b/trunk/src/app/srs_app_config.hpp index f7f449b08..c17e26033 100644 --- a/trunk/src/app/srs_app_config.hpp +++ b/trunk/src/app/srs_app_config.hpp @@ -333,6 +333,8 @@ private: // Reload the http_stream section of config. // TODO: FIXME: rename to http_server. virtual srs_error_t reload_http_stream(SrsConfDirective* old_root); + // Reload the rtc_server section of config. + virtual srs_error_t reload_rtc_server(SrsConfDirective* old_root); // Reload the transcode section of vhost of config. virtual srs_error_t reload_transcode(SrsConfDirective* new_vhost, SrsConfDirective* old_vhost); // Reload the ingest section of vhost of config. diff --git a/trunk/src/app/srs_app_reload.cpp b/trunk/src/app/srs_app_reload.cpp index 175cbfc14..3546f44de 100644 --- a/trunk/src/app/srs_app_reload.cpp +++ b/trunk/src/app/srs_app_reload.cpp @@ -115,6 +115,11 @@ srs_error_t ISrsReloadHandler::on_reload_http_stream_crossdomain() return srs_success; } +srs_error_t ISrsReloadHandler::on_reload_rtc_server() +{ + return srs_success; +} + srs_error_t ISrsReloadHandler::on_reload_vhost_http_updated() { return srs_success; diff --git a/trunk/src/app/srs_app_reload.hpp b/trunk/src/app/srs_app_reload.hpp index 442f44ebd..a7af5e790 100644 --- a/trunk/src/app/srs_app_reload.hpp +++ b/trunk/src/app/srs_app_reload.hpp @@ -55,6 +55,7 @@ public: virtual srs_error_t on_reload_http_stream_disabled(); virtual srs_error_t on_reload_http_stream_updated(); virtual srs_error_t on_reload_http_stream_crossdomain(); + virtual srs_error_t on_reload_rtc_server(); public: // TODO: FIXME: should rename to http_static virtual srs_error_t on_reload_vhost_http_updated(); diff --git a/trunk/src/app/srs_app_rtc_conn.cpp b/trunk/src/app/srs_app_rtc_conn.cpp index ec4a5c501..bdcc8c705 100644 --- a/trunk/src/app/srs_app_rtc_conn.cpp +++ b/trunk/src/app/srs_app_rtc_conn.cpp @@ -1098,10 +1098,14 @@ SrsRtcServer::SrsRtcServer() trd = new SrsDummyCoroutine(); cache_pos = 0; + + _srs_config->subscribe(this); } SrsRtcServer::~SrsRtcServer() { + _srs_config->unsubscribe(this); + srs_freep(listener); srs_freep(timer); @@ -1133,6 +1137,9 @@ srs_error_t SrsRtcServer::initialize() return srs_error_wrap(err, "start coroutine"); } + max_sendmmsg = _srs_config->get_rtc_server_sendmmsg(); + srs_trace("RTC server init ok, max_sendmmsg=%d", max_sendmmsg); + return err; } @@ -1351,6 +1358,17 @@ srs_error_t SrsRtcServer::notify(int type, srs_utime_t interval, srs_utime_t tic return srs_success; } +srs_error_t SrsRtcServer::on_reload_rtc_server() +{ + int v = _srs_config->get_rtc_server_sendmmsg(); + if (max_sendmmsg != v) { + max_sendmmsg = v; + srs_trace("Reload max_sendmmsg=%d", max_sendmmsg); + } + + return srs_success; +} + mmsghdr* SrsRtcServer::fetch() { // TODO: FIXME: Maybe need to shrink? @@ -1404,9 +1422,6 @@ srs_error_t SrsRtcServer::cycle() SrsPithyPrint* pprint = SrsPithyPrint::create_rtc_send(); SrsAutoFree(SrsPithyPrint, pprint); - // TODO: FIXME: Support reload. - int max_sendmmsg = _srs_config->get_rtc_server_sendmmsg(); - while (true) { if ((err = trd->pull()) != srs_success) { return err; @@ -1441,8 +1456,6 @@ srs_error_t SrsRtcServer::cycle() pprint->elapse(); if (pprint->can_print()) { - // TODO: FIXME: Support reload. - max_sendmmsg = _srs_config->get_rtc_server_sendmmsg(); srs_trace("-> RTC SEND %d by sendmmsg %d, total %" PRId64 " msgs", pos, max_sendmmsg, nn_msgs); } } diff --git a/trunk/src/app/srs_app_rtc_conn.hpp b/trunk/src/app/srs_app_rtc_conn.hpp index 9ccc297dc..f7cb9137d 100644 --- a/trunk/src/app/srs_app_rtc_conn.hpp +++ b/trunk/src/app/srs_app_rtc_conn.hpp @@ -32,6 +32,7 @@ #include #include #include +#include #include #include @@ -214,7 +215,8 @@ private: srs_error_t on_rtcp_receiver_report(char* buf, int nb_buf, SrsUdpMuxSocket* udp_mux_skt); }; -class SrsRtcServer : virtual public ISrsUdpMuxHandler, virtual public ISrsHourGlass, virtual public ISrsCoroutineHandler +class SrsRtcServer : virtual public ISrsUdpMuxHandler, virtual public ISrsHourGlass, + virtual public ISrsCoroutineHandler, virtual public ISrsReloadHandler { private: SrsUdpMuxListener* listener; @@ -231,6 +233,8 @@ private: // Cache msgs, for other coroutines to fill it. std::vector cache; int cache_pos; + // The max number of messages for sendmmsg. If 1, we use sendmsg to send. + int max_sendmmsg; private: std::map map_username_session; // key: username(local_ufrag + ":" + remote_ufrag) std::map map_id_session; // key: peerip(ip + ":" + port) @@ -259,6 +263,9 @@ private: // interface ISrsHourGlass public: virtual srs_error_t notify(int type, srs_utime_t interval, srs_utime_t tick); +// interface ISrsReloadHandler +public: + virtual srs_error_t on_reload_rtc_server(); // Internal only. public: mmsghdr* fetch();