loolwsd/Util.cpp | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-)
New commits: commit 11f7746640df5d97d9adcc259017402512ed917f Author: Ashod Nakashian <[email protected]> Date: Tue Jan 19 20:06:23 2016 -0500 loolwsd: avoid reentering Poco::Log and deadlocking while handling signal Change-Id: I3ee16ac32a337a9e1ff798495d45fb1359f4f063 Reviewed-on: https://gerrit.libreoffice.org/21674 Reviewed-by: Ashod Nakashian <[email protected]> Tested-by: Ashod Nakashian <[email protected]> diff --git a/loolwsd/Util.cpp b/loolwsd/Util.cpp index 44baa40..ec8d9b9 100644 --- a/loolwsd/Util.cpp +++ b/loolwsd/Util.cpp @@ -418,17 +418,23 @@ namespace Util 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) + if (!TerminationFlag) { - 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); + // Poco::Log takes a lock that isn't recursive. + // If we are signaled while having that lock, + // logging again will deadlock on it. + TerminationFlag = true; + TerminationState = ( aSignal == SIGTERM ? LOOLState::LOOL_ABNORMAL : LOOLState::LOOL_STOPPING ); + + Log::info() << "Signal received: " << strsignal(aSignal) << Log::end; + if (aSignal == SIGSEGV || aSignal == SIGBUS) + { + Log::error() << "\nSegfault! Attach debugger with:\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); + } } } _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
