[Libreoffice-commits] online.git: net/Socket.hpp wsd/DocumentBroker.cpp wsd/DocumentBroker.hpp wsd/LOOLWSD.cpp

Michael Meeks michael.meeks at collabora.com
Thu Apr 6 15:33:42 UTC 2017


 net/Socket.hpp         |    3 +++
 wsd/DocumentBroker.cpp |    5 +++++
 wsd/DocumentBroker.hpp |    3 +++
 wsd/LOOLWSD.cpp        |    4 ++--
 4 files changed, 13 insertions(+), 2 deletions(-)

New commits:
commit df8dc43be4980302d4287c0692d02cf4fe6ca253
Author: Michael Meeks <michael.meeks at collabora.com>
Date:   Wed Apr 5 21:48:51 2017 +0100

    Don't cleanup DocumentBrokers that still have their thread running.
    
    Plenty of time to do that next time around the cleanup.
    We should still, really be doing the majority of the timeout work
    inside the DocumentBroker poll itself.

diff --git a/net/Socket.hpp b/net/Socket.hpp
index c726f337..42238751 100644
--- a/net/Socket.hpp
+++ b/net/Socket.hpp
@@ -500,6 +500,9 @@ public:
     /// Stop and join the polling thread before returning (if active)
     void joinThread();
 
+    /// Did our thread complete its execution
+    bool isThreadFinished() { return _threadFinished; }
+
 private:
     /// Initialize the poll fds array with the right events
     void setupPollFds(std::chrono::steady_clock::time_point now,
diff --git a/wsd/DocumentBroker.cpp b/wsd/DocumentBroker.cpp
index a5a995df..9515fbb4 100644
--- a/wsd/DocumentBroker.cpp
+++ b/wsd/DocumentBroker.cpp
@@ -305,6 +305,11 @@ DocumentBroker::~DocumentBroker()
     _childProcess.reset();
 }
 
+bool DocumentBroker::isThreadFinished()
+{
+    return _poll->isThreadFinished();
+}
+
 void DocumentBroker::joinThread()
 {
     _poll->joinThread();
diff --git a/wsd/DocumentBroker.hpp b/wsd/DocumentBroker.hpp
index d05437e9..11d50174 100644
--- a/wsd/DocumentBroker.hpp
+++ b/wsd/DocumentBroker.hpp
@@ -227,6 +227,9 @@ public:
     /// Thread safe termination of this broker if it has a lingering thread
     void joinThread();
 
+    /// Is our polling thread safely out of the way
+    bool isThreadFinished();
+
     /// Loads a document from the public URI into the jail.
     bool load(const std::shared_ptr<ClientSession>& session, const std::string& jailId);
     bool isLoaded() const { return _isLoaded; }
diff --git a/wsd/LOOLWSD.cpp b/wsd/LOOLWSD.cpp
index e5d4cb68..1c446462 100644
--- a/wsd/LOOLWSD.cpp
+++ b/wsd/LOOLWSD.cpp
@@ -250,8 +250,8 @@ void cleanupDocBrokers()
                         " DocumentBroker for docKey [" << it->first << "].");
                 docBroker->stop();
 
-                // Remove only when not alive.
-                if (!docBroker->isAlive())
+                // Remove only on next pass when the thread is finished.
+                if (docBroker->isThreadFinished() && !docBroker->isAlive())
                 {
                     LOG_INF("Removing " << (idle ? "idle" : "dead") <<
                             " DocumentBroker for docKey [" << it->first << "].");


More information about the Libreoffice-commits mailing list