diff --git a/trunk/src/app/srs_app_config.cpp b/trunk/src/app/srs_app_config.cpp index 2c2f3e273..871afb653 100644 --- a/trunk/src/app/srs_app_config.cpp +++ b/trunk/src/app/srs_app_config.cpp @@ -768,6 +768,17 @@ int SrsConfig::reload_vhost(SrsConfDirective* old_root) } srs_trace("vhost %s reload smi success.", vhost.c_str()); } + // tcp_nodelay, only one per vhost + if (!srs_directive_equals(new_vhost->get("tcp_nodelay"), old_vhost->get("tcp_nodelay"))) { + for (it = subscribes.begin(); it != subscribes.end(); ++it) { + ISrsReloadHandler* subscribe = *it; + if ((ret = subscribe->on_reload_vhost_tcp_nodelay(vhost)) != ERROR_SUCCESS) { + srs_error("vhost %s notify subscribes tcp_nodelay failed. ret=%d", vhost.c_str(), ret); + return ret; + } + } + srs_trace("vhost %s reload tcp_nodelay success.", vhost.c_str()); + } // publish_1stpkt_timeout, only one per vhost if (!srs_directive_equals(new_vhost->get("publish_1stpkt_timeout"), old_vhost->get("publish_1stpkt_timeout"))) { for (it = subscribes.begin(); it != subscribes.end(); ++it) { diff --git a/trunk/src/app/srs_app_reload.cpp b/trunk/src/app/srs_app_reload.cpp index d660c7630..ba4ab09ad 100644 --- a/trunk/src/app/srs_app_reload.cpp +++ b/trunk/src/app/srs_app_reload.cpp @@ -175,6 +175,11 @@ int ISrsReloadHandler::on_reload_vhost_smi(string /*vhost*/) return ERROR_SUCCESS; } +int ISrsReloadHandler::on_reload_vhost_tcp_nodelay(string /*vhost*/) +{ + return ERROR_SUCCESS; +} + int ISrsReloadHandler::on_reload_vhost_realtime(string /*vhost*/) { return ERROR_SUCCESS; diff --git a/trunk/src/app/srs_app_reload.hpp b/trunk/src/app/srs_app_reload.hpp index 989b73433..ceb32194c 100644 --- a/trunk/src/app/srs_app_reload.hpp +++ b/trunk/src/app/srs_app_reload.hpp @@ -74,6 +74,7 @@ public: virtual int on_reload_vhost_mr(std::string vhost); virtual int on_reload_vhost_mw(std::string vhost); virtual int on_reload_vhost_smi(std::string vhost); + virtual int on_reload_vhost_tcp_nodelay(std::string vhost); virtual int on_reload_vhost_realtime(std::string vhost); virtual int on_reload_vhost_p1stpt(std::string vhost); virtual int on_reload_vhost_pnt(std::string vhost); diff --git a/trunk/src/app/srs_app_rtmp_conn.cpp b/trunk/src/app/srs_app_rtmp_conn.cpp index 98b3d8732..e4561b932 100755 --- a/trunk/src/app/srs_app_rtmp_conn.cpp +++ b/trunk/src/app/srs_app_rtmp_conn.cpp @@ -94,6 +94,7 @@ SrsRtmpConn::SrsRtmpConn(SrsServer* svr, st_netfd_t c) mw_enabled = false; realtime = SRS_PERF_MIN_LATENCY_ENABLED; send_min_interval = 0; + tcp_nodelay = false; _srs_config->subscribe(this); } @@ -265,6 +266,19 @@ int SrsRtmpConn::on_reload_vhost_smi(string vhost) return ret; } +int SrsRtmpConn::on_reload_vhost_tcp_nodelay(string vhost) +{ + int ret = ERROR_SUCCESS; + + if (req->vhost != vhost) { + return ret; + } + + set_sock_options(); + + return ret; +} + int SrsRtmpConn::on_reload_vhost_realtime(string vhost) { int ret = ERROR_SUCCESS; @@ -651,8 +665,8 @@ int SrsRtmpConn::do_playing(SrsSource* source, SrsConsumer* consumer, SrsQueueRe // set the sock options. set_sock_options(); - srs_trace("start play smi=%.2f, mw_sleep=%d, mw_enabled=%d, realtime=%d", - send_min_interval, mw_sleep, mw_enabled, realtime); + srs_trace("start play smi=%.2f, mw_sleep=%d, mw_enabled=%d, realtime=%d, tcp_nodelay=%d", + send_min_interval, mw_sleep, mw_enabled, realtime, tcp_nodelay); while (!disposed) { // collect elapse for pithy print. @@ -837,15 +851,18 @@ int SrsRtmpConn::do_publishing(SrsSource* source, SrsPublishRecvThread* trd) return ret; } + // initialize the publish timeout. + publish_1stpkt_timeout = _srs_config->get_publish_1stpkt_timeout(req->vhost); + publish_normal_timeout = _srs_config->get_publish_1stpkt_timeout(req->vhost); + // set the sock options. set_sock_options(); if (true) { bool mr = _srs_config->get_mr_enabled(req->vhost); int mr_sleep = _srs_config->get_mr_sleep_ms(req->vhost); - publish_1stpkt_timeout = _srs_config->get_publish_1stpkt_timeout(req->vhost); - publish_normal_timeout = _srs_config->get_publish_1stpkt_timeout(req->vhost); - srs_trace("start publish mr=%d/%d, p1stpt=%d, pnt=%d", mr, mr_sleep, publish_1stpkt_timeout, publish_normal_timeout); + srs_trace("start publish mr=%d/%d, p1stpt=%d, pnt=%d, tcp_nodelay=%d", + mr, mr_sleep, publish_1stpkt_timeout, publish_normal_timeout, tcp_nodelay); } int64_t nb_msgs = 0; @@ -1173,22 +1190,24 @@ void SrsRtmpConn::change_mw_sleep(int sleep_ms) void SrsRtmpConn::set_sock_options() { - if (_srs_config->get_tcp_nodelay(req->vhost)) { + bool nvalue = _srs_config->get_tcp_nodelay(req->vhost); + if (nvalue != tcp_nodelay) { + tcp_nodelay = nvalue; #ifdef SRS_PERF_TCP_NODELAY int fd = st_netfd_fileno(stfd); - + socklen_t nb_v = sizeof(int); - + int ov = 0; getsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &ov, &nb_v); - - int v = 1; + + int v = tcp_nodelay; // set the socket send buffer when required larger buffer if (setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &v, nb_v) < 0) { srs_warn("set sock TCP_NODELAY=%d failed.", v); } getsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &v, &nb_v); - + srs_trace("set TCP_NODELAY %d=>%d", ov, v); #else srs_warn("SRS_PERF_TCP_NODELAY is disabled but tcp_nodelay configed."); diff --git a/trunk/src/app/srs_app_rtmp_conn.hpp b/trunk/src/app/srs_app_rtmp_conn.hpp index 983d1fae0..c7bbd6577 100755 --- a/trunk/src/app/srs_app_rtmp_conn.hpp +++ b/trunk/src/app/srs_app_rtmp_conn.hpp @@ -91,6 +91,8 @@ private: int publish_1stpkt_timeout; // publish normal packet timeout in ms int publish_normal_timeout; + // whether enable the tcp_nodelay. + bool tcp_nodelay; public: SrsRtmpConn(SrsServer* svr, st_netfd_t c); virtual ~SrsRtmpConn(); @@ -103,6 +105,7 @@ public: virtual int on_reload_vhost_removed(std::string vhost); virtual int on_reload_vhost_mw(std::string vhost); virtual int on_reload_vhost_smi(std::string vhost); + virtual int on_reload_vhost_tcp_nodelay(std::string vhost); virtual int on_reload_vhost_realtime(std::string vhost); virtual int on_reload_vhost_p1stpt(std::string vhost); virtual int on_reload_vhost_pnt(std::string vhost);