From f652c28485a11dd0cf5439272e1ddeac7095ca9f Mon Sep 17 00:00:00 2001 From: winlin Date: Sat, 12 Apr 2014 20:46:32 +0800 Subject: [PATCH] support reload pid. --- trunk/src/app/srs_app_config.cpp | 15 +++++++++++++++ trunk/src/app/srs_app_reload.cpp | 5 +++++ trunk/src/app/srs_app_reload.hpp | 1 + trunk/src/app/srs_app_server.cpp | 17 +++++++++++++++++ trunk/src/app/srs_app_server.hpp | 3 +++ 5 files changed, 41 insertions(+) diff --git a/trunk/src/app/srs_app_config.cpp b/trunk/src/app/srs_app_config.cpp index 4262f2500..1eebcc4a8 100644 --- a/trunk/src/app/srs_app_config.cpp +++ b/trunk/src/app/srs_app_config.cpp @@ -505,6 +505,21 @@ int SrsConfig::reload() srs_trace("reload listen success."); } + // merge config: pid + if (!srs_directive_equals(root->get("pid"), old_root->get("pid"))) { + for (it = subscribes.begin(); it != subscribes.end(); ++it) { + ISrsReloadHandler* subscribe = *it; + if ((ret = subscribe->on_reload_pid()) != ERROR_SUCCESS) { + srs_error("notify subscribes reload pid failed. ret=%d", ret); + return ret; + } + } + srs_trace("reload pid success."); + } + + // directly supported for reload: + // chunk_size, ff_log_dir + // merge config: pithy_print if (!srs_directive_equals(root->get("pithy_print"), old_root->get("pithy_print"))) { 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 1cc7bc51a..16860da15 100644 --- a/trunk/src/app/srs_app_reload.cpp +++ b/trunk/src/app/srs_app_reload.cpp @@ -40,6 +40,11 @@ int ISrsReloadHandler::on_reload_listen() return ERROR_SUCCESS; } +int ISrsReloadHandler::on_reload_pid() +{ + return ERROR_SUCCESS; +} + int ISrsReloadHandler::on_reload_pithy_print() { return ERROR_SUCCESS; diff --git a/trunk/src/app/srs_app_reload.hpp b/trunk/src/app/srs_app_reload.hpp index 547b268a5..6c50fe10d 100644 --- a/trunk/src/app/srs_app_reload.hpp +++ b/trunk/src/app/srs_app_reload.hpp @@ -42,6 +42,7 @@ public: virtual ~ISrsReloadHandler(); public: virtual int on_reload_listen(); + virtual int on_reload_pid(); virtual int on_reload_pithy_print(); virtual int on_reload_vhost_added(std::string vhost); virtual int on_reload_vhost_removed(std::string vhost); diff --git a/trunk/src/app/srs_app_server.cpp b/trunk/src/app/srs_app_server.cpp index f9fcec863..ae68a9b86 100644 --- a/trunk/src/app/srs_app_server.cpp +++ b/trunk/src/app/srs_app_server.cpp @@ -159,6 +159,7 @@ SrsServer::SrsServer() { signal_reload = false; signal_gmc_stop = false; + pid_fd = -1; // donot new object in constructor, // for some global instance is not ready now, @@ -189,6 +190,11 @@ SrsServer::~SrsServer() close_listeners(); + if (pid_fd > 0) { + ::close(pid_fd); + pid_fd = -1; + } + #ifdef SRS_HTTP_API srs_freep(http_api_handler); #endif @@ -310,6 +316,7 @@ int SrsServer::acquire_pid_file() } srs_trace("write pid=%d to %s success!", pid, pid_file.c_str()); + pid_fd = fd; return ret; } @@ -554,3 +561,13 @@ int SrsServer::on_reload_listen() { return listen(); } + +int SrsServer::on_reload_pid() +{ + if (pid_fd > 0) { + ::close(pid_fd); + pid_fd = -1; + } + + return acquire_pid_file(); +} diff --git a/trunk/src/app/srs_app_server.hpp b/trunk/src/app/srs_app_server.hpp index d46982a83..7de1cdecd 100644 --- a/trunk/src/app/srs_app_server.hpp +++ b/trunk/src/app/srs_app_server.hpp @@ -88,6 +88,7 @@ private: SrsIngester* ingester; #endif private: + int pid_fd; std::vector conns; std::vector listeners; bool signal_reload; @@ -107,8 +108,10 @@ public: private: virtual void close_listeners(); virtual int accept_client(SrsListenerType type, st_netfd_t client_stfd); +// interface ISrsThreadHandler. public: virtual int on_reload_listen(); + virtual int on_reload_pid(); }; #endif \ No newline at end of file