From: Gunnar Beutner Date: Sun, 3 Feb 2013 15:00:53 +0000 (+0100) Subject: Bugfix: Deadlock in SigHupHandler due to Event::Post not being signal-safe X-Git-Tag: v0.0.2~563 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2834edfd719906487cc8cd74f2a39fcc5b4aed7d;p=icinga2 Bugfix: Deadlock in SigHupHandler due to Event::Post not being signal-safe Fixes #3622 --- diff --git a/icinga-app/icinga.cpp b/icinga-app/icinga.cpp index 23ebe0168..8b70cfec6 100644 --- a/icinga-app/icinga.cpp +++ b/icinga-app/icinga.cpp @@ -33,6 +33,11 @@ namespace po = boost::program_options; static po::variables_map g_AppParams; static vector g_ConfigItems; +#ifndef _WIN32 +static bool g_ReloadConfig = false; +static Timer::Ptr g_ReloadConfigTimer; +#endif /* _WIN32 */ + static bool LoadConfigFiles(void) { set allItems; @@ -97,13 +102,20 @@ static bool LoadConfigFiles(void) } +static void ReloadConfigTimerHandler(void) +{ + if (g_ReloadConfig) { + Logger::Write(LogInformation, "icinga-app", "Received SIGHUP. Reloading config files."); + LoadConfigFiles(); + g_ReloadConfig = false; + } +} + static void SigHupHandler(int signum) { assert(signum == SIGHUP); - Logger::Write(LogInformation, "icinga-app", "Received SIGHUP. Reloading config files."); - - Event::Post(boost::bind(&LoadConfigFiles)); + g_ReloadConfig = true; } /** @@ -252,6 +264,11 @@ int main(int argc, char **argv) memset(&sa, 0, sizeof(sa)); sa.sa_handler = &SigHupHandler; sigaction(SIGHUP, &sa, NULL); + + g_ReloadConfigTimer = boost::make_shared(); + g_ReloadConfigTimer->SetInterval(1); + g_ReloadConfigTimer->OnTimerExpired.connect(boost::bind(&ReloadConfigTimerHandler)); + g_ReloadConfigTimer->Start(); #endif /* _WIN32 */ return app->Run();