From 249408209d900ae5a8116092e2bd665b5069e7fe Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Mon, 15 Jul 2019 12:11:19 +0200 Subject: [PATCH] Reload on SIGHUP refs #5230 --- lib/cli/daemoncommand.cpp | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/lib/cli/daemoncommand.cpp b/lib/cli/daemoncommand.cpp index 9f1133bf7..dbc683649 100644 --- a/lib/cli/daemoncommand.cpp +++ b/lib/cli/daemoncommand.cpp @@ -178,6 +178,7 @@ std::vector DaemonCommand::GetArgumentSuggestions(const String& argument #ifndef _WIN32 pid_t l_UmbrellaPid = 0; +static std::atomic l_AllowedToWork (false); #endif /* _WIN32 */ static inline @@ -194,6 +195,10 @@ int RunWorker(const std::vector& configs) #ifndef _WIN32 // Notify umbrella process about the config loading success. (void)kill(l_UmbrellaPid, SIGUSR2); + + while (!l_AllowedToWork.load()) { + Utility::Sleep(0.2); + } #endif /* _WIN32 */ /* restore the previous program state */ @@ -248,6 +253,7 @@ static const sigset_t l_UnixWorkerSignals = ([]() -> sigset_t { (void)sigaddset(&s, SIGUSR2); (void)sigaddset(&s, SIGINT); (void)sigaddset(&s, SIGTERM); + (void)sigaddset(&s, SIGHUP); return s; })(); @@ -255,6 +261,7 @@ static const sigset_t l_UnixWorkerSignals = ([]() -> sigset_t { static std::atomic l_CurrentlyStartingUnixWorkerPid (-1); static std::atomic l_CurrentlyStartingUnixWorkerState (UnixWorkerState::Pending); static std::atomic l_TermSignal (-1); +static std::atomic l_RequestedReload (false); static void UmbrellaSignalHandler(int num, siginfo_t *info, void*) { @@ -283,12 +290,20 @@ static void UmbrellaSignalHandler(int num, siginfo_t *info, void*) } l_TermSignal.store(num); + break; + case SIGHUP: + l_RequestedReload.store(true); } } static void WorkerSignalHandler(int num, siginfo_t *info, void*) { switch (num) { + case SIGUSR2: + if (info->si_pid == l_UmbrellaPid) { + l_AllowedToWork.store(true); + } + break; case SIGINT: case SIGTERM: if (info->si_pid == l_UmbrellaPid) { @@ -326,7 +341,7 @@ static pid_t StartUnixWorker(const std::vector& configs) sa.sa_handler = SIG_DFL; (void)sigaction(SIGCHLD, &sa, nullptr); - (void)sigaction(SIGUSR2, &sa, nullptr); + (void)sigaction(SIGHUP, &sa, nullptr); } { @@ -336,6 +351,7 @@ static pid_t StartUnixWorker(const std::vector& configs) sa.sa_sigaction = &WorkerSignalHandler; sa.sa_flags = SA_RESTART | SA_SIGINFO; + (void)sigaction(SIGUSR2, &sa, nullptr); (void)sigaction(SIGINT, &sa, nullptr); (void)sigaction(SIGTERM, &sa, nullptr); } @@ -473,6 +489,7 @@ int DaemonCommand::Run(const po::variables_map& vm, const std::vector 0) { -- 2.40.0