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