[Libreoffice-commits] online.git: loolwsd/LOOLBroker.cpp

Ashod Nakashian ashod.nakashian at collabora.co.uk
Wed Mar 30 01:56:13 UTC 2016


 loolwsd/LOOLBroker.cpp |   39 +++++++++++++++++----------------------
 1 file changed, 17 insertions(+), 22 deletions(-)

New commits:
commit 59db6cbc09fa6c52e180bfc3365f20f430195665
Author: Ashod Nakashian <ashod.nakashian at collabora.co.uk>
Date:   Sun Mar 27 23:26:01 2016 -0400

    loolwsd: recursive_mutex -> mutex in LOOLBroker
    
    Change-Id: I72be54cc67b965bbd13a6630d1243d8d59ba0fc4
    Reviewed-on: https://gerrit.libreoffice.org/23641
    Reviewed-by: Ashod Nakashian <ashnakash at gmail.com>
    Tested-by: Ashod Nakashian <ashnakash at gmail.com>

diff --git a/loolwsd/LOOLBroker.cpp b/loolwsd/LOOLBroker.cpp
index b62b26b..af64448 100644
--- a/loolwsd/LOOLBroker.cpp
+++ b/loolwsd/LOOLBroker.cpp
@@ -43,7 +43,7 @@ static std::chrono::steady_clock::time_point lastMaintenanceTime = std::chrono::
 static unsigned int childCounter = 0;
 static int numPreSpawnedChildren = 0;
 
-static std::recursive_mutex forkMutex;
+static std::mutex forkMutex;
 
 namespace
 {
@@ -137,14 +137,10 @@ namespace
 
     static std::map<Process::PID, std::shared_ptr<ChildProcess>> _childProcesses;
 
-    /// Safely looks up a child hosting a URL.
+    /// Looks up a child hosting a URL, or returns an empty one.
     std::shared_ptr<ChildProcess> findChild(const std::string& url)
     {
-        std::lock_guard<std::recursive_mutex> lock(forkMutex);
-
         std::shared_ptr<ChildProcess> child;
-        Log::trace() << "Finding child for url [" << url << "] in "
-                     << _childProcesses.size() << " childs." << Log::end;
         for (const auto& it : _childProcesses)
         {
             Log::trace() << "Child [" << it.second->getPid()
@@ -164,19 +160,17 @@ namespace
         return child;
     }
 
-    /// Safely looks up the pipe descriptor
+    /// Looks up the pipe descriptor
     /// of a child. Returns -1 on error.
     int getChildPipe(const Process::PID pid)
     {
-        std::lock_guard<std::recursive_mutex> lock(forkMutex);
         const auto it = _childProcesses.find(pid);
         return (it != _childProcesses.end() ? it->second->getWritePipe() : -1);
     }
 
-    /// Safely removes a child process.
+    /// Removes a child process.
     void removeChild(const Process::PID pid, const bool rude)
     {
-        std::lock_guard<std::recursive_mutex> lock(forkMutex);
         const auto it = _childProcesses.find(pid);
         if (it != _childProcesses.end())
         {
@@ -270,8 +264,6 @@ public:
     /// Returns the number of empty children.
     size_t syncChildren()
     {
-        std::lock_guard<std::recursive_mutex> lock(forkMutex);
-
         Log::trace("Synching children.");
         size_t empty_count = 0;
         for (auto it = _childProcesses.begin(); it != _childProcesses.end(); )
@@ -325,9 +317,10 @@ public:
 
     void handleInput(const std::string& message)
     {
-        std::lock_guard<std::recursive_mutex> lock(forkMutex);
-
         StringTokenizer tokens(message, " ", StringTokenizer::TOK_IGNORE_EMPTY | StringTokenizer::TOK_TRIM);
+
+        std::lock_guard<std::mutex> lock(forkMutex);
+
         if (tokens[0] == "request" && tokens.count() == 3)
         {
             const std::string session = tokens[1];
@@ -353,14 +346,15 @@ public:
                 {
                     child->setUrl(url);
                     Log::debug("Child [" + childPid + "] now hosts [" + url + "] for session [" + session + "].");
-                    return;
                 }
-
-                Log::error("Error creating thread [" + session + "] for URL [" + url + "] on child [" + childPid + "].");
-                if (isEmptyChild)
+                else
                 {
-                    // This is probably a child in bad state. Rid of it and create new.
-                    removeChild(child->getPid(), true);
+                    Log::error("Error creating thread [" + session + "] for URL [" + url + "] on child [" + childPid + "].");
+                    if (isEmptyChild)
+                    {
+                        // This is probably a child in bad state. Rid of it and create new.
+                        removeChild(child->getPid(), true);
+                    }
                 }
             }
             else
@@ -761,6 +755,7 @@ int main(int argc, char** argv)
         const pid_t pid = waitpid(-1, &status, WUNTRACED | WNOHANG);
         if (pid > 0)
         {
+            std::lock_guard<std::mutex> lock(forkMutex);
             if (WIFEXITED(status))
             {
                 childExitCode = Util::getChildStatus(WEXITSTATUS(status));
@@ -826,7 +821,7 @@ int main(int argc, char** argv)
                 }
                 else
                 {
-                    Log::error("Error: last child exited with error code.");
+                    Log::error("Error: last child exited with error code. Terminating.");
                     TerminationFlag = true; //FIXME: Why?
                     continue;
                 }
@@ -839,7 +834,7 @@ int main(int argc, char** argv)
 
         if (forkCounter > 0 && childExitCode == EXIT_SUCCESS)
         {
-            std::lock_guard<std::recursive_mutex> lock(forkMutex);
+            std::lock_guard<std::mutex> lock(forkMutex);
 
             const int empty = pipeHandler.syncChildren();
             const int total = _childProcesses.size();


More information about the Libreoffice-commits mailing list