loolwsd/DocumentBroker.cpp | 4 +++- loolwsd/DocumentBroker.hpp | 3 +++ loolwsd/LOOLWSD.cpp | 5 ++++- loolwsd/MasterProcessSession.cpp | 11 +++++++++++ 4 files changed, 21 insertions(+), 2 deletions(-)
New commits: commit bde67c99344751702116e3409d96b52db07b15e8 Author: Ashod Nakashian <ashod.nakash...@collabora.co.uk> Date: Fri Apr 22 00:11:24 2016 -0400 loolwsd: track document modified state to avoid unnecessary auto-saving This also avoids the feedback loop that results from the kit thinking the previously inactive client is now active and sending commands (.uno:Save). Change-Id: I47074b35a922da15592d550032d494ba1efab83e Reviewed-on: https://gerrit.libreoffice.org/24287 Reviewed-by: Ashod Nakashian <ashnak...@gmail.com> Tested-by: Ashod Nakashian <ashnak...@gmail.com> diff --git a/loolwsd/DocumentBroker.cpp b/loolwsd/DocumentBroker.cpp index 10776b3..5a21bad 100644 --- a/loolwsd/DocumentBroker.cpp +++ b/loolwsd/DocumentBroker.cpp @@ -73,7 +73,8 @@ DocumentBroker::DocumentBroker(const Poco::URI& uriPublic, _cacheRoot(getCachePath(uriPublic.toString())), _lastSaveTime(std::chrono::steady_clock::now()), _childProcess(childProcess), - _markToDestroy(false) + _markToDestroy(false), + _isModified(false) { assert(!_docKey.empty()); assert(!_childRoot.empty()); @@ -153,6 +154,7 @@ bool DocumentBroker::save() assert(_storage && _tileCache); if (_storage->saveLocalFileToStorage()) { + _isModified = false; _lastSaveTime = std::chrono::steady_clock::now(); _tileCache->documentSaved(); Log::debug("Saved to URI [" + uri + "] and updated tile cache."); diff --git a/loolwsd/DocumentBroker.hpp b/loolwsd/DocumentBroker.hpp index 2a1e73d..b696a65 100644 --- a/loolwsd/DocumentBroker.hpp +++ b/loolwsd/DocumentBroker.hpp @@ -177,6 +177,8 @@ public: // Called when the last view is going out. bool canDestroy(); bool isMarkedToDestroy() const { return _markToDestroy; } + bool isModified() const { return _isModified; } + void setModified(const bool value) { _isModified = value; } private: const Poco::URI _uriPublic; @@ -192,6 +194,7 @@ private: std::unique_ptr<TileCache> _tileCache; std::shared_ptr<ChildProcess> _childProcess; bool _markToDestroy; + bool _isModified; mutable std::mutex _mutex; std::condition_variable _saveCV; std::mutex _saveMutex; diff --git a/loolwsd/LOOLWSD.cpp b/loolwsd/LOOLWSD.cpp index e6886a4..6a377fc 100644 --- a/loolwsd/LOOLWSD.cpp +++ b/loolwsd/LOOLWSD.cpp @@ -1594,7 +1594,10 @@ int LOOLWSD::main(const std::vector<std::string>& /*args*/) std::unique_lock<std::mutex> docBrokersLock(docBrokersMutex); for (auto& brokerIt : docBrokers) { - brokerIt.second->autoSave(false); + if (brokerIt.second->isModified()) + { + brokerIt.second->autoSave(false); + } } } catch (const std::exception& exc) diff --git a/loolwsd/MasterProcessSession.cpp b/loolwsd/MasterProcessSession.cpp index 1fa0a03..99f143e 100644 --- a/loolwsd/MasterProcessSession.cpp +++ b/loolwsd/MasterProcessSession.cpp @@ -164,6 +164,17 @@ bool MasterProcessSession::_handleInput(const char *buffer, int length) return true; } + else if (tokens.count() == 2 && tokens[0] == "statechanged:") + { + StringTokenizer stateTokens(tokens[1], "=", StringTokenizer::TOK_IGNORE_EMPTY | StringTokenizer::TOK_TRIM); + if (stateTokens.count() == 2 && stateTokens[0] == ".uno:ModifiedStatus") + { + if (_docBroker) + { + _docBroker->setModified(stateTokens[1] == "true"); + } + } + } } if (peer && !_isDocPasswordProtected) _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits