loolwsd/LOOLKit.cpp | 36 ++++++++++++++++++++++++++---------- loolwsd/test/data/timeline.xlsx |binary 2 files changed, 26 insertions(+), 10 deletions(-)
New commits: commit 82bd7a606a1e14f354a237e613ee0a3c6f5a17f1 Author: Ashod Nakashian <ashod.nakash...@collabora.co.uk> Date: Fri Mar 25 12:31:48 2016 -0400 loolwsd: recursive_mutex -> mutex and new loading synchronization mechanics Change-Id: I20249ca56ca3e9203e6a989e6fe9972b6b4eca36 Reviewed-on: https://gerrit.libreoffice.org/23528 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 6158642..e4fa310 100644 --- a/loolwsd/LOOLKit.cpp +++ b/loolwsd/LOOLKit.cpp @@ -21,6 +21,7 @@ #include <dlfcn.h> #include <atomic> +#include <condition_variable> #include <cstdlib> #include <cstring> #include <iostream> @@ -324,6 +325,7 @@ public: _isDocLoaded(false), _isDocPasswordProtected(false), _docPasswordType(PasswordType::ToView), + _isLoading(0), _clientViews(0) { (void)_isDocLoaded; // FIXME LOOLBroker.cpp includes LOOLKit.cpp @@ -366,7 +368,7 @@ public: } } - std::unique_lock<std::recursive_mutex> lock(_mutex); + std::unique_lock<std::mutex> lock(_mutex); // Destroy all connections and views. _connections.clear(); @@ -381,7 +383,7 @@ public: void createSession(const std::string& sessionId, const unsigned intSessionId) { - std::unique_lock<std::recursive_mutex> lock(_mutex); + std::unique_lock<std::mutex> lock(_mutex); const auto& it = _connections.find(intSessionId); if (it != _connections.end()) @@ -436,7 +438,7 @@ public: std::vector<std::shared_ptr<ChildProcessSession>> deadSessions; size_t num_connections = 0; { - std::unique_lock<std::recursive_mutex> lock(_mutex, std::defer_lock); + std::unique_lock<std::mutex> lock(_mutex, std::defer_lock); if (!lock.try_lock()) { // Not a good time, try later. @@ -523,7 +525,7 @@ private: if (self) { - std::unique_lock<std::recursive_mutex> lock(self->_mutex); + std::unique_lock<std::mutex> lock(self->_mutex); for (auto& it: self->_connections) { if (it.second->isRunning()) @@ -567,7 +569,7 @@ private: Document* self = reinterpret_cast<Document*>(pData); if (self) { - std::unique_lock<std::recursive_mutex> lock(self->_mutex); + std::unique_lock<std::mutex> lock(self->_mutex); for (auto& it: self->_connections) { @@ -589,7 +591,15 @@ private: Log::info("Session " + sessionId + " is loading. " + std::to_string(_clientViews) + " views loaded."); const unsigned intSessionId = Util::decodeId(sessionId); - std::unique_lock<std::recursive_mutex> lock(_mutex); + std::unique_lock<std::mutex> lock(_mutex); + while (_isLoading) + { + _cvLoading.wait(lock); + } + + // Flag and release lock. + ++_isLoading; + lock.unlock(); const auto it = _connections.find(intSessionId); if (it == _connections.end() || !it->second) @@ -605,7 +615,7 @@ private: // This is the first time we are loading the document Log::info("Loading new document from URI: [" + uri + "] for session [" + sessionId + "]."); - if ( LIBREOFFICEKIT_HAS(_loKit, registerCallback)) + if (LIBREOFFICEKIT_HAS(_loKit, registerCallback)) { _loKit->pClass->registerCallback(_loKit, KitCallback, this); _loKit->pClass->setOptionalFeatures(_loKit, LOK_FEATURE_DOCUMENT_PASSWORD | @@ -689,7 +699,11 @@ private: } } + // Done loading, let the next one in (if any). + lock.lock(); ++_clientViews; + --_isLoading; + _cvLoading.notify_one(); std::ostringstream message; message << "addview" << " " @@ -713,7 +727,7 @@ private: auto session = it->second->getSession(); auto sessionLock = session->getLock(); - std::unique_lock<std::recursive_mutex> lock(_mutex); + std::unique_lock<std::mutex> lock(_mutex); --_clientViews; @@ -760,9 +774,11 @@ private: // Whether password is required to view the document, or modify it PasswordType _docPasswordType; - std::recursive_mutex _mutex; + std::mutex _mutex; + std::condition_variable _cvLoading; + std::atomic_size_t _isLoading; std::map<unsigned, std::shared_ptr<Connection>> _connections; - std::atomic<unsigned> _clientViews; + std::atomic_size_t _clientViews; }; void lokit_main(const std::string& childRoot, diff --git a/loolwsd/test/data/timeline.xlsx b/loolwsd/test/data/timeline.xlsx new file mode 100644 index 0000000..77a15f6 Binary files /dev/null and b/loolwsd/test/data/timeline.xlsx differ _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits