[Libreoffice-commits] online.git: common/SigUtil.cpp common/SigUtil.hpp wsd/Admin.cpp wsd/ClientSession.cpp wsd/DocumentBroker.cpp wsd/LOOLWSD.cpp

Miklos Vajna (via logerrit) logerrit at kemper.freedesktop.org
Mon Aug 12 07:04:01 UTC 2019


 common/SigUtil.cpp     |   16 +++++++++++++++-
 common/SigUtil.hpp     |   12 ++++++++++--
 wsd/Admin.cpp          |    4 ++--
 wsd/ClientSession.cpp  |    2 +-
 wsd/DocumentBroker.cpp |   10 +++++-----
 wsd/LOOLWSD.cpp        |   14 +++++++-------
 6 files changed, 40 insertions(+), 18 deletions(-)

New commits:
commit 1263694944dffde36e12d42e72105fb10d10a4b1
Author:     Miklos Vajna <vmiklos at collabora.com>
AuthorDate: Mon Aug 12 09:03:16 2019 +0200
Commit:     Miklos Vajna <vmiklos at collabora.com>
CommitDate: Mon Aug 12 09:03:42 2019 +0200

    common: wrap ShutdownRequestFlag in a getter function to avoid ODR violation
    
    Otherwise both loolwsd and unit-copy-paste.so would have a
    ShutdownRequestFlag:
    
    ==13663==ERROR: AddressSanitizer: odr-violation (0x00000208f860):
      [1] size=1 'ShutdownRequestFlag' ../common/SigUtil.cpp:60:19
      [2] size=1 'ShutdownRequestFlag' common/SigUtil.cpp:60:19
    These globals were registered at these points:
      [1]:
        #0 0x5f9a18 in __asan_register_globals.part.13 /home/vmiklos/git/libreoffice/lode/packages/llvm-472c6ef8b0f53061b049039f9775ab127beafbe4.src/compiler-rt/lib/asan/asan_globals.cc:365
        #1 0x7f9b903f1d0b in asan.module_ctor (/home/vmiklos/git/libreoffice/online-san/test/../test/.libs/unit-copy-paste.so+0x60ad0b)
    
      [2]:
        #0 0x5f9a18 in __asan_register_globals.part.13 /home/vmiklos/git/libreoffice/lode/packages/llvm-472c6ef8b0f53061b049039f9775ab127beafbe4.src/compiler-rt/lib/asan/asan_globals.cc:365
        #1 0xe2b9fe in asan.module_ctor (/home/vmiklos/git/libreoffice/online-san/loolwsd+0xe2b9fe)
    
    Change-Id: I247760325f804813249e814dbb4576493619dee7

diff --git a/common/SigUtil.cpp b/common/SigUtil.cpp
index 49387b38d..61111b867 100644
--- a/common/SigUtil.cpp
+++ b/common/SigUtil.cpp
@@ -54,10 +54,24 @@ namespace SigUtil
 
 #if MOBILEAPP
 std::atomic<bool> MobileTerminationFlag(false);
+namespace SigUtil
+{
+    bool getShutdownRequestFlag()
+    {
+        return ShutdownRequestFlag;
+    }
+}
 #endif
 
 #if !MOBILEAPP
-std::atomic<bool> ShutdownRequestFlag(false);
+static std::atomic<bool> ShutdownRequestFlag(false);
+namespace SigUtil
+{
+    std::atomic<bool>& getShutdownRequestFlag()
+    {
+        return ShutdownRequestFlag;
+    }
+}
 
 std::mutex SigHandlerTrap;
 
diff --git a/common/SigUtil.hpp b/common/SigUtil.hpp
index ea7595ab6..9a366dc6d 100644
--- a/common/SigUtil.hpp
+++ b/common/SigUtil.hpp
@@ -14,10 +14,18 @@
 #include <mutex>
 
 #if !MOBILEAPP
-/// Flag to commence clean shutdown
-extern std::atomic<bool> ShutdownRequestFlag;
+namespace SigUtil
+{
+    /// Flag to commence clean shutdown
+    std::atomic<bool>& getShutdownRequestFlag();
+}
 #else
 static constexpr bool ShutdownRequestFlag(false);
+namespace SigUtil
+{
+    /// Flag to commence clean shutdown
+    bool getShutdownRequestFlag();
+}
 #endif
 
 namespace SigUtil
diff --git a/wsd/Admin.cpp b/wsd/Admin.cpp
index 05babf1d2..cb8c43ceb 100644
--- a/wsd/Admin.cpp
+++ b/wsd/Admin.cpp
@@ -191,7 +191,7 @@ void AdminSocketHandler::handleMessage(bool /* fin */, WSOpCode /* code */,
     else if (tokens[0] == "shutdown")
     {
         LOG_INF("Shutdown requested by admin.");
-        ShutdownRequestFlag = true;
+        SigUtil::getShutdownRequestFlag() = true;
         SocketPoll::wakeupWorld();
         return;
     }
@@ -389,7 +389,7 @@ void Admin::pollingThread()
     lastMem = lastCPU;
     lastNet = lastCPU;
 
-    while (!isStop() && !SigUtil::getTerminationFlag() && !ShutdownRequestFlag)
+    while (!isStop() && !SigUtil::getTerminationFlag() && !SigUtil::getShutdownRequestFlag())
     {
         const std::chrono::steady_clock::time_point now = std::chrono::steady_clock::now();
 
diff --git a/wsd/ClientSession.cpp b/wsd/ClientSession.cpp
index c24f04f57..a382afbd9 100644
--- a/wsd/ClientSession.cpp
+++ b/wsd/ClientSession.cpp
@@ -1557,7 +1557,7 @@ void ClientSession::onDisconnect()
             // respond with close frame
             shutdown();
         }
-        else if (!ShutdownRequestFlag)
+        else if (!SigUtil::getShutdownRequestFlag())
         {
             // something wrong, with internal exceptions
             LOG_TRC("Abnormal close handshake.");
diff --git a/wsd/DocumentBroker.cpp b/wsd/DocumentBroker.cpp
index 39e2be94c..deb9104b8 100644
--- a/wsd/DocumentBroker.cpp
+++ b/wsd/DocumentBroker.cpp
@@ -231,7 +231,7 @@ void DocumentBroker::pollThread()
         // Nominal time between retries, lest we busy-loop. getNewChild could also wait, so don't double that here.
         std::this_thread::sleep_for(std::chrono::milliseconds(CHILD_REBALANCE_INTERVAL_MS / 10));
     }
-    while (!_stop && _poll->continuePolling() && !SigUtil::getTerminationFlag() && !ShutdownRequestFlag);
+    while (!_stop && _poll->continuePolling() && !SigUtil::getTerminationFlag() && !SigUtil::getShutdownRequestFlag());
 #else
     _childProcess = getNewChild_Blocks(getPublicUri().getPath());
 #endif
@@ -324,9 +324,9 @@ void DocumentBroker::pollThread()
             continue;
         }
 
-        if (ShutdownRequestFlag || _closeRequest)
+        if (SigUtil::getShutdownRequestFlag() || _closeRequest)
         {
-            const std::string reason = ShutdownRequestFlag ? "recycling" : _closeReason;
+            const std::string reason = SigUtil::getShutdownRequestFlag() ? "recycling" : _closeReason;
             LOG_INF("Autosaving DocumentBroker for docKey [" << getDocKey() << "] for " << reason);
             if (!autoSave(isPossiblyModified()))
             {
@@ -387,7 +387,7 @@ void DocumentBroker::pollThread()
     }
 
     LOG_INF("Finished polling doc [" << _docKey << "]. stop: " << _stop << ", continuePolling: " <<
-            _poll->continuePolling() << ", ShutdownRequestFlag: " << ShutdownRequestFlag <<
+            _poll->continuePolling() << ", ShutdownRequestFlag: " << SigUtil::getShutdownRequestFlag() <<
             ", TerminationFlag: " << SigUtil::getTerminationFlag() << ", closeReason: " << _closeReason << ". Flushing socket.");
 
     if (_isModified)
@@ -411,7 +411,7 @@ void DocumentBroker::pollThread()
     }
 
     LOG_INF("Finished flushing socket for doc [" << _docKey << "]. stop: " << _stop << ", continuePolling: " <<
-            _poll->continuePolling() << ", ShutdownRequestFlag: " << ShutdownRequestFlag <<
+            _poll->continuePolling() << ", ShutdownRequestFlag: " << SigUtil::getShutdownRequestFlag() <<
             ", TerminationFlag: " << SigUtil::getTerminationFlag() << ". Terminating child with reason: [" << _closeReason << "].");
 
     // Terminate properly while we can.
diff --git a/wsd/LOOLWSD.cpp b/wsd/LOOLWSD.cpp
index 1493399f5..e053c4107 100644
--- a/wsd/LOOLWSD.cpp
+++ b/wsd/LOOLWSD.cpp
@@ -1406,7 +1406,7 @@ bool LOOLWSD::checkAndRestoreForKit()
     if (ForKitProcId == -1)
     {
         // Fire the ForKit process for the first time.
-        if (!ShutdownRequestFlag && !SigUtil::getTerminationFlag() && !createForKit())
+        if (!SigUtil::getShutdownRequestFlag() && !SigUtil::getTerminationFlag() && !createForKit())
         {
             // Should never fail.
             LOG_FTL("Failed to spawn loolforkit.");
@@ -1435,7 +1435,7 @@ bool LOOLWSD::checkAndRestoreForKit()
                 }
 
                 // Spawn a new forkit and try to dust it off and resume.
-                if (!ShutdownRequestFlag && !SigUtil::getTerminationFlag() && !createForKit())
+                if (!SigUtil::getShutdownRequestFlag() && !SigUtil::getTerminationFlag() && !createForKit())
                 {
                     LOG_FTL("Failed to spawn forkit instance. Shutting down.");
                     SigUtil::requestShutdown();
@@ -1469,7 +1469,7 @@ bool LOOLWSD::checkAndRestoreForKit()
         {
             // No child processes.
             // Spawn a new forkit and try to dust it off and resume.
-            if (!ShutdownRequestFlag && !SigUtil::getTerminationFlag() && !createForKit())
+            if (!SigUtil::getShutdownRequestFlag() && !SigUtil::getTerminationFlag() && !createForKit())
             {
                 LOG_FTL("Failed to spawn forkit instance. Shutting down.");
                 SigUtil::requestShutdown();
@@ -3101,7 +3101,7 @@ public:
                             << (LOOLWSD::NoSeccomp ? "no" : "") << " api lockdown\n"
 #endif
            << "  TerminationFlag: " << SigUtil::getTerminationFlag() << "\n"
-           << "  isShuttingDown: " << ShutdownRequestFlag << "\n"
+           << "  isShuttingDown: " << SigUtil::getShutdownRequestFlag() << "\n"
            << "  NewChildren: " << NewChildren.size() << "\n"
            << "  OutstandingForks: " << OutstandingForks << "\n"
            << "  NumPreSpawnedChildren: " << LOOLWSD::NumPreSpawnedChildren << "\n";
@@ -3399,7 +3399,7 @@ int LOOLWSD::innerMain()
 
     const auto startStamp = std::chrono::steady_clock::now();
 
-    while (!SigUtil::getTerminationFlag() && !ShutdownRequestFlag)
+    while (!SigUtil::getTerminationFlag() && !SigUtil::getShutdownRequestFlag())
     {
         UnitWSD::get().invokeTest();
 
@@ -3430,14 +3430,14 @@ int LOOLWSD::innerMain()
     // Stop the listening to new connections
     // and wait until sockets close.
     LOG_INF("Stopping server socket listening. ShutdownRequestFlag: " <<
-            ShutdownRequestFlag << ", TerminationFlag: " << SigUtil::getTerminationFlag());
+            SigUtil::getShutdownRequestFlag() << ", TerminationFlag: " << SigUtil::getTerminationFlag());
 
     // Wait until documents are saved and sessions closed.
     srv.stop();
 
     // atexit handlers tend to free Admin before Documents
     LOG_INF("Cleaning up lingering documents.");
-    if (ShutdownRequestFlag || SigUtil::getTerminationFlag())
+    if (SigUtil::getShutdownRequestFlag() || SigUtil::getTerminationFlag())
     {
         // Don't stop the DocBroker, they will exit.
         const size_t sleepMs = 300;


More information about the Libreoffice-commits mailing list