[Libreoffice-commits] online.git: loolwsd/LOOLKit.cpp
Ashod Nakashian
ashod.nakashian at collabora.co.uk
Mon Aug 22 05:15:46 UTC 2016
loolwsd/LOOLKit.cpp | 36 +++++++++++++++++++++++++++++-------
1 file changed, 29 insertions(+), 7 deletions(-)
New commits:
commit 39a1fd0addcd2f4d93c0947b070ba175a9f89ca6
Author: Ashod Nakashian <ashod.nakashian at collabora.co.uk>
Date: Sat Aug 20 09:10:30 2016 -0400
loolwsd: Document unloading doesn't hold Document lock anymore
Change-Id: I4be051b9a24a7a971211e6f7159d959c5f504c0e
Reviewed-on: https://gerrit.libreoffice.org/28296
Reviewed-by: Ashod Nakashian <ashnakash at gmail.com>
Tested-by: Ashod Nakashian <ashnakash at gmail.com>
diff --git a/loolwsd/LOOLKit.cpp b/loolwsd/LOOLKit.cpp
index f21268b..806201c 100644
--- a/loolwsd/LOOLKit.cpp
+++ b/loolwsd/LOOLKit.cpp
@@ -791,6 +791,8 @@ private:
<< "] [" << LOKitHelper::kitCallbackTypeToString(nType)
<< "] [" << payload << "]." << Log::end;
+ std::unique_lock<std::mutex> lock(pDescr->Doc->_mutex);
+
// Forward to the same view only.
// Demultiplexing is done by Core.
// TODO: replace with a map to be faster.
@@ -885,27 +887,47 @@ private:
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 || !_loKitDocument->get())
+ if (_loKitDocument == nullptr)
{
- // Nothing to do.
- Log::error("No [" + sessionId + "] session!");
+ Log::error("Unloading session [" + sessionId + "] without loKitDocument.");
return;
}
+ // Find this session connection.
+ int sessionViewId = -1;
+ {
+ std::unique_lock<std::mutex> lock(_mutex);
+
+ const auto it = _connections.find(intSessionId);
+ if (it == _connections.end() || !it->second || !it->second->getSession())
+ {
+ Log::error("Session [" + sessionId + "] not found to unload.");
+ return;
+ }
+
+ sessionViewId = it->second->getSession()->getViewId();
+ }
+
--_clientViews;
Log::info("Session " + sessionId + " is unloading. " + std::to_string(_clientViews) +
" view" + (_clientViews != 1 ? "s" : "") + " remain.");
- if (_multiView && _loKitDocument)
+ if (_multiView)
{
Log::info() << "Document [" << _url << "] session ["
<< sessionId << "] unloaded, leaving "
<< _clientViews << " views." << Log::end;
+ std::unique_lock<std::mutex> lock(_loKitDocument->getLock());
+
const auto viewId = _loKitDocument->getView();
+ if (viewId != sessionViewId)
+ {
+ Log::error() << "Unloading view [" << sessionViewId
+ << "] from view [" << viewId << "]." << Log::end;
+ return;
+ }
+
_viewIdToCallbackDescr.erase(viewId);
_loKitDocument->registerCallback(nullptr, nullptr);
_loKitDocument->destroyView(viewId);
More information about the Libreoffice-commits
mailing list