loolwsd/LOOLKit.cpp | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-)
New commits: commit f64a18d5202e4c2c9a7f34f25b8b7728931693ec Author: Ashod Nakashian <ashod.nakash...@collabora.co.uk> Date: Sun Aug 14 11:54:14 2016 -0400 loolwsd: corrected ChildSession and connection cleanup ChildSession and Connection are run their own thread and their destruction depends on the connection, which of course is completely asynchronous. This change fires the destruction of the ChildSession, which unloads the view, without destroying the connection. The latter is cleaned up when purgeSessions() is invoked. Change-Id: I341bfdbdd4b37338d1813ec707a51aeb3be59497 Reviewed-on: https://gerrit.libreoffice.org/28130 Reviewed-by: Ashod Nakashian <ashnak...@gmail.com> Tested-by: Ashod Nakashian <ashnak...@gmail.com> diff --git a/loolwsd/LOOLKit.cpp b/loolwsd/LOOLKit.cpp index 4c9d545..a05c7e1 100644 --- a/loolwsd/LOOLKit.cpp +++ b/loolwsd/LOOLKit.cpp @@ -232,17 +232,18 @@ class Connection: public Runnable public: Connection(std::shared_ptr<ChildSession> session, std::shared_ptr<WebSocket> ws) : + _sessionId(session->getId()), _session(std::move(session)), _ws(std::move(ws)), _stop(false), _joined(false) { - Log::info("Connection ctor in child for " + _session->getId()); + Log::info("Connection ctor in child for " + _sessionId); } ~Connection() { - Log::info("~Connection dtor in child for " + _session->getId()); + Log::info("~Connection dtor in child for " + _sessionId); stop(); join(); } @@ -278,7 +279,7 @@ public: void run() override { - Util::setThreadName("kit_ws_" + _session->getId()); + Util::setThreadName("kit_ws_" + _sessionId); Log::debug("Thread started."); @@ -324,15 +325,18 @@ public: Log::error("Connection::run:: Unexpected exception"); } + // Release the session and unload view. + _session.reset(); Log::debug("Thread finished."); } private: + const std::string _sessionId; Thread _thread; std::shared_ptr<ChildSession> _session; std::shared_ptr<WebSocket> _ws; - std::atomic<bool> _stop; std::mutex _threadMutex; + std::atomic<bool> _stop; std::atomic<bool> _joined; }; @@ -862,22 +866,22 @@ private: void onUnload(const std::string& sessionId) { + Log::info("Unloading [" + sessionId + "]."); const unsigned intSessionId = Util::decodeId(sessionId); + + std::unique_lock<std::mutex> lock(_mutex); + const auto it = _connections.find(intSessionId); if (it == _connections.end() || !it->second || !_loKitDocument) { // Nothing to do. + Log::error("No [" + sessionId + "] session!"); return; } - auto session = it->second->getSession(); - auto sessionLock = session->getLock(); - std::unique_lock<std::mutex> lock(_mutex); - - Log::info("Session " + sessionId + " is unloading. Erasing connection."); - _connections.erase(it); --_clientViews; - Log::info("Session " + sessionId + " is unloading. " + std::to_string(_clientViews) + " views will remain."); + Log::info("Session " + sessionId + " is unloading. " + std::to_string(_clientViews) + + " view" + (_clientViews != 1 ? "s" : "") + " remain."); if (_multiView && _loKitDocument) { _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits