loolwsd/Common.hpp | 4 ---- loolwsd/LOOLBroker.cpp | 4 +--- loolwsd/LOOLKit.cpp | 29 +---------------------------- loolwsd/LOOLWSD.cpp | 26 ++------------------------ loolwsd/LOOLWSD.hpp | 3 --- loolwsd/Util.cpp | 39 +++++++++++++++++++++++++++++++++++++++ loolwsd/Util.hpp | 10 ++++++++++ 7 files changed, 53 insertions(+), 62 deletions(-)
New commits: commit 5bf75f56ca88f96d9d8a47c788207cb2a742a556 Author: Ashod Nakashian <[email protected]> Date: Sat Jan 9 13:51:55 2016 -0500 loolwsd: centralized signal handling and eased debugging Change-Id: Ifdb3e2bca540bec3c6dea1ab24173c8ea0267706 Reviewed-on: https://gerrit.libreoffice.org/21325 Reviewed-by: Ashod Nakashian <[email protected]> Tested-by: Ashod Nakashian <[email protected]> diff --git a/loolwsd/Common.hpp b/loolwsd/Common.hpp index 1be1a89..10c3d7e 100644 --- a/loolwsd/Common.hpp +++ b/loolwsd/Common.hpp @@ -13,7 +13,6 @@ #include <string> -enum class LOOLState { LOOL_STARTING, LOOL_STOPPING, LOOL_ABNORMAL }; constexpr int DEFAULT_CLIENT_PORT_NUMBER = 9980; constexpr int MASTER_PORT_NUMBER = 9981; constexpr int INTERVAL_PROBES = 10; @@ -25,8 +24,5 @@ constexpr int PIPE_BUFFER = 1024; static const std::string JailedDocumentRoot = "/user/docs/"; -// Flag to stop pump loops. -static volatile bool TerminationFlag = false; - #endif /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/loolwsd/LOOLBroker.cpp b/loolwsd/LOOLBroker.cpp index a63899b..515aa90 100644 --- a/loolwsd/LOOLBroker.cpp +++ b/loolwsd/LOOLBroker.cpp @@ -612,9 +612,7 @@ int main(int argc, char** argv) // Initialization Log::initialize("brk"); -#ifdef __linux - setSignals(false); -#endif + Util::setSignals(false); std::string childRoot; std::string jailId; diff --git a/loolwsd/LOOLKit.cpp b/loolwsd/LOOLKit.cpp index 7c9f86e..0d806eb 100644 --- a/loolwsd/LOOLKit.cpp +++ b/loolwsd/LOOLKit.cpp @@ -60,33 +60,6 @@ using Poco::FastMutex; const std::string CHILD_URI = "/loolws/child/"; const std::string LOKIT_BROKER = "/tmp/loolbroker.fifo"; -static LOOLState TerminationState; - -namespace -{ - void handleSignal(int aSignal) - { - Log::info() << "Signal received: " << strsignal(aSignal) << Log::end; - TerminationState = ( aSignal == SIGTERM ? LOOLState::LOOL_ABNORMAL : LOOLState::LOOL_STOPPING ); - TerminationFlag = true; - } - - void setSignals(bool isIgnored) - { -#ifdef __linux - struct sigaction aSigAction; - - sigemptyset(&aSigAction.sa_mask); - aSigAction.sa_flags = 0; - aSigAction.sa_handler = (isIgnored ? SIG_IGN : handleSignal); - - sigaction(SIGTERM, &aSigAction, nullptr); - sigaction(SIGINT, &aSigAction, nullptr); - sigaction(SIGQUIT, &aSigAction, nullptr); - sigaction(SIGHUP, &aSigAction, nullptr); -#endif - } -} // This thread handles callbacks from the // lokit instance. @@ -714,7 +687,7 @@ void lokit_main(const std::string &loSubPath, const std::string& jailId, const s #ifdef __linux if (prctl(PR_SET_NAME, reinterpret_cast<unsigned long>(process_name.c_str()), 0, 0, 0) != 0) Log::error("Cannot set process name to " + process_name + "."); - setSignals(false); + Util::setSignals(false); #endif Log::debug("Process [" + process_name + "] started."); diff --git a/loolwsd/LOOLWSD.cpp b/loolwsd/LOOLWSD.cpp index 1d1a17b..71e9915 100644 --- a/loolwsd/LOOLWSD.cpp +++ b/loolwsd/LOOLWSD.cpp @@ -663,28 +663,6 @@ LOOLWSD::~LOOLWSD() { } -void LOOLWSD::handleSignal(int aSignal) -{ - Log::info() << "Signal received: " << strsignal(aSignal) << Log::end; - TerminationFlag = true; -} - -void LOOLWSD::setSignals(bool isIgnored) -{ -#ifdef __linux - struct sigaction aSigAction; - - sigemptyset(&aSigAction.sa_mask); - aSigAction.sa_flags = 0; - aSigAction.sa_handler = (isIgnored ? SIG_IGN : handleSignal); - - sigaction(SIGTERM, &aSigAction, nullptr); - sigaction(SIGINT, &aSigAction, nullptr); - sigaction(SIGQUIT, &aSigAction, nullptr); - sigaction(SIGHUP, &aSigAction, nullptr); -#endif -} - void LOOLWSD::initialize(Application& self) { ServerApplication::initialize(self); @@ -829,10 +807,10 @@ int LOOLWSD::main(const std::vector<std::string>& /*args*/) char *locale = setlocale(LC_ALL, nullptr); if (locale == nullptr || std::strcmp(locale, "C") == 0) setlocale(LC_ALL, "en_US.utf8"); - - setSignals(false); #endif + Util::setSignals(false); + if (access(cache.c_str(), R_OK | W_OK | X_OK) != 0) { Log::error("Unable to access cache [" + cache + diff --git a/loolwsd/LOOLWSD.hpp b/loolwsd/LOOLWSD.hpp index 4108775..50bde75 100644 --- a/loolwsd/LOOLWSD.hpp +++ b/loolwsd/LOOLWSD.hpp @@ -176,9 +176,6 @@ public: } protected: - static void setSignals(bool bIgnore); - static void handleSignal(int nSignal); - void initialize(Poco::Util::Application& self) override; void uninitialize() override; void defineOptions(Poco::Util::OptionSet& options) override; diff --git a/loolwsd/Util.cpp b/loolwsd/Util.cpp index d474e4d..fbe9c2d 100644 --- a/loolwsd/Util.cpp +++ b/loolwsd/Util.cpp @@ -35,6 +35,7 @@ #include <Poco/Environment.h> #include <Poco/ConsoleChannel.h> +#include <Common.hpp> #include "Util.hpp" #include "Png.hpp" @@ -59,6 +60,9 @@ extern "C" } } +volatile LOOLState TerminationState = LOOLState::LOOL_RUNNING; +volatile bool TerminationFlag = false; + namespace Util { namespace rng @@ -389,6 +393,41 @@ namespace Util ErrorPoll: return nBytes; } + + static + void handleSignal(int aSignal) + { + Log::info() << "Signal received: " << strsignal(aSignal) << Log::end; + TerminationFlag = true; + TerminationState = ( aSignal == SIGTERM ? LOOLState::LOOL_ABNORMAL : LOOLState::LOOL_STOPPING ); + + if (aSignal == SIGSEGV || aSignal == SIGBUS) + { + Log::error() << "\nSegfault! Stalling for 10 seconds to attach debugger. Use:\n" + << "sudo gdb --pid=" << Poco::Process::id() << "\n or \n" + << "sudo gdb --q --n --ex 'thread apply all backtrace full' --batch --pid=" + << Poco::Process::id() << "\n" << Log::end; + sleep(10); + } + } + + void setSignals(bool isIgnored) + { +#ifdef __linux + struct sigaction aSigAction; + + sigemptyset(&aSigAction.sa_mask); + aSigAction.sa_flags = 0; + aSigAction.sa_handler = (isIgnored ? SIG_IGN : handleSignal); + + sigaction(SIGTERM, &aSigAction, nullptr); + sigaction(SIGINT, &aSigAction, nullptr); + sigaction(SIGQUIT, &aSigAction, nullptr); + sigaction(SIGHUP, &aSigAction, nullptr); + sigaction(SIGBUS, &aSigAction, nullptr); + sigaction(SIGSEGV, &aSigAction, nullptr); +#endif + } } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/loolwsd/Util.hpp b/loolwsd/Util.hpp index 95dd5ef..b363505 100644 --- a/loolwsd/Util.hpp +++ b/loolwsd/Util.hpp @@ -22,6 +22,13 @@ #define LOK_USE_UNSTABLE_API #include <LibreOfficeKit/LibreOfficeKitEnums.h> +// Possible states of LOOL processes. +enum class LOOLState { LOOL_RUNNING, LOOL_STOPPING, LOOL_ABNORMAL }; +extern volatile LOOLState TerminationState; + +/// Flag to stop pump loops. +extern volatile bool TerminationFlag; + namespace Util { namespace rng @@ -76,6 +83,9 @@ namespace Util { removeFile(path.toString(), recursive); } + + /// Trap signals to cleanup and exit the process gracefully. + void setSignals(bool isIgnored); }; //TODO: Move to own file. _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
