loolwsd/LOOLKit.cpp |    7 +++----
 loolwsd/Util.cpp    |    3 +++
 loolwsd/Util.hpp    |    5 +++++
 3 files changed, 11 insertions(+), 4 deletions(-)

New commits:
commit 57c5e55a4dd589216493cd4d88a71fb24e784d02
Author: Ashod Nakashian <ashod.nakash...@collabora.co.uk>
Date:   Fri Oct 14 23:10:03 2016 -0400

    loolwsd: trap signal handler to prevent premature exit
    
    When upon cleanup we segfault we want to avoid
    forcible exit using _Exit(). This was done by
    an unconditional wait (sleep).
    
    This patch changes that mechanism into a latch
    (mutex) that traps the exit when the sig handler
    is invoked, therby preventing exit as long as
    necessary for the sighandler to finish.
    
    Change-Id: Ifc8e972be12645a1b310d4cb4e3a4172afc31327
    Reviewed-on: https://gerrit.libreoffice.org/29945
    Reviewed-by: Ashod Nakashian <ashnak...@gmail.com>
    Tested-by: Ashod Nakashian <ashnak...@gmail.com>

diff --git a/loolwsd/LOOLKit.cpp b/loolwsd/LOOLKit.cpp
index 94e5a5a..0ddcac5 100644
--- a/loolwsd/LOOLKit.cpp
+++ b/loolwsd/LOOLKit.cpp
@@ -1561,11 +1561,10 @@ void lokit_main(const std::string& childRoot,
         Log::error(std::string("Exception: ") + exc.what());
     }
 
-    // Sleep a second here in case we get a fatal signal just when about to 
finish up, which sadly
-    // seems to happen often, so that handleFatalSignal() in Util.cpp has time 
to produce a
-    // backtrace.
-    sleep(1);
+    // Trap the signal handler, if invoked,
+    // to prevent exiting.
     Log::info("Process finished.");
+    std::unique_lock<std::mutex> lock(SigHandlerTrap);
     std::_Exit(Application::EXIT_OK);
 }
 #endif
diff --git a/loolwsd/Util.cpp b/loolwsd/Util.cpp
index c367630..1f53d7e 100644
--- a/loolwsd/Util.cpp
+++ b/loolwsd/Util.cpp
@@ -50,6 +50,7 @@
 #include "Util.hpp"
 
 std::atomic<bool> TerminationFlag(false);
+std::mutex SigHandlerTrap;
 
 namespace Util
 {
@@ -393,6 +394,8 @@ namespace Util
     static
     void handleFatalSignal(const int signal)
     {
+        std::unique_lock<std::mutex> lock(SigHandlerTrap);
+
         Log::signalLogPrefix();
         Log::signalLog(" Fatal signal received: ");
         Log::signalLog(signalName(signal));
diff --git a/loolwsd/Util.hpp b/loolwsd/Util.hpp
index 7d73ecc..a55c70e 100644
--- a/loolwsd/Util.hpp
+++ b/loolwsd/Util.hpp
@@ -31,6 +31,11 @@
 /// Flag to stop pump loops.
 extern std::atomic<bool> TerminationFlag;
 
+/// Mutex to trap signal handler, if any,
+/// and prevent _Exit while collecting backtrace.
+extern std::mutex SigHandlerTrap;
+
+
 namespace Util
 {
     namespace rng
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to