loolwsd/Admin.cpp   |    8 +++++++-
 loolwsd/LOOLWSD.cpp |   10 +++++-----
 loolwsd/Util.cpp    |    1 +
 loolwsd/Util.hpp    |    3 +++
 4 files changed, 16 insertions(+), 6 deletions(-)

New commits:
commit d02f677ffff8be1e23fa30946e806db08c8274da
Author: Ashod Nakashian <ashod.nakash...@collabora.co.uk>
Date:   Sun Nov 13 23:55:18 2016 -0500

    loolwsd: support shutdown admin command
    
    Change-Id: Ib87ad2c289d59734c7a7a12e821de89e61c05079
    Reviewed-on: https://gerrit.libreoffice.org/30831
    Reviewed-by: Ashod Nakashian <ashnak...@gmail.com>
    Tested-by: Ashod Nakashian <ashnak...@gmail.com>

diff --git a/loolwsd/Admin.cpp b/loolwsd/Admin.cpp
index 560acbe..dc2aa9d 100644
--- a/loolwsd/Admin.cpp
+++ b/loolwsd/Admin.cpp
@@ -91,7 +91,7 @@ bool AdminRequestHandler::adminCommandHandler(const 
std::vector<char>& payload)
              tokens[0] == "active_users_count" ||
              tokens[0] == "active_docs_count" ||
              tokens[0] == "mem_stats" ||
-             tokens[0] == "cpu_stats" )
+             tokens[0] == "cpu_stats")
     {
         const std::string result = model.query(tokens[0]);
         if (!result.empty())
@@ -144,6 +144,12 @@ bool AdminRequestHandler::adminCommandHandler(const 
std::vector<char>& payload)
         std::string responseFrame = oss.str();
         sendTextFrame(responseFrame);
     }
+    else if (tokens[0] == "shutdown")
+    {
+        LOG_INF("Shutdown requested by admin.");
+        ShutdownFlag = true;
+        return false;
+    }
     else if (tokens[0] == "set" && tokens.count() > 1)
     {
         for (unsigned i = 1; i < tokens.count(); i++)
diff --git a/loolwsd/LOOLWSD.cpp b/loolwsd/LOOLWSD.cpp
index 91329d6..4bd22bb 100644
--- a/loolwsd/LOOLWSD.cpp
+++ b/loolwsd/LOOLWSD.cpp
@@ -884,7 +884,7 @@ private:
                     return session->handleInput(payload.data(), 
payload.size());
                 },
                 [&session]() { session->closeFrame(); },
-                []() { return !!TerminationFlag; });
+                []() { return TerminationFlag || ShutdownFlag; });
 
             // Connection terminated. Destroy session.
             LOG_DBG("Client session [" << id << "] terminated. Cleaning up.");
@@ -1966,7 +1966,7 @@ int LOOLWSD::main(const std::vector<std::string>& 
/*args*/)
 
     time_t last30SecCheck = time(nullptr);
     int status = 0;
-    while (!TerminationFlag)
+    while (!TerminationFlag && !ShutdownFlag)
     {
         UnitWSD::get().invokeTest();
         if (TerminationFlag)
@@ -2073,11 +2073,11 @@ int LOOLWSD::main(const std::vector<std::string>& 
/*args*/)
 #endif
     }
 
-    // stop the service, no more request
+    // Stop the listening to new connections
+    // and wait until sockets close.
+    LOG_INF("Stopping server socket listening.");
     srv.stop();
     srv2.stop();
-
-    // close all websockets
     threadPool.joinAll();
 
     // Terminate child processes
diff --git a/loolwsd/Util.cpp b/loolwsd/Util.cpp
index deb2819..2bc780c 100644
--- a/loolwsd/Util.cpp
+++ b/loolwsd/Util.cpp
@@ -51,6 +51,7 @@
 #include "Util.hpp"
 
 std::atomic<bool> TerminationFlag(false);
+std::atomic<bool> ShutdownFlag(false);
 std::mutex SigHandlerTrap;
 
 namespace Util
diff --git a/loolwsd/Util.hpp b/loolwsd/Util.hpp
index 2303a65..792835c 100644
--- a/loolwsd/Util.hpp
+++ b/loolwsd/Util.hpp
@@ -30,6 +30,9 @@
 /// Flag to stop pump loops.
 extern std::atomic<bool> TerminationFlag;
 
+/// Flag to shutdown the server.
+extern std::atomic<bool> ShutdownFlag;
+
 /// Mutex to trap signal handler, if any,
 /// and prevent _Exit while collecting backtrace.
 extern std::mutex SigHandlerTrap;
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to