[Libreoffice-commits] online.git: loolwsd/DocumentBroker.cpp loolwsd/DocumentBroker.hpp loolwsd/LOOLWSD.cpp
Ashod Nakashian
ashod.nakashian at collabora.co.uk
Mon Oct 10 06:16:06 UTC 2016
loolwsd/DocumentBroker.cpp | 39 ++++++++++++++++++++-------------------
loolwsd/DocumentBroker.hpp | 16 +++++++---------
loolwsd/LOOLWSD.cpp | 9 +++++----
3 files changed, 32 insertions(+), 32 deletions(-)
New commits:
commit 22fb71c6729cb9139714054bf7096619c3c0aa1e
Author: Ashod Nakashian <ashod.nakashian at collabora.co.uk>
Date: Sat Oct 8 10:31:35 2016 -0400
loolwsd: cleanup lastEditableSession flag in DocumentBroker
Change-Id: Iab3a226e3ff089c6bdab264d6f1b1d639bcf3b37
Reviewed-on: https://gerrit.libreoffice.org/29630
Reviewed-by: Ashod Nakashian <ashnakash at gmail.com>
Tested-by: Ashod Nakashian <ashnakash at gmail.com>
diff --git a/loolwsd/DocumentBroker.cpp b/loolwsd/DocumentBroker.cpp
index d6aba21..896e7e4 100644
--- a/loolwsd/DocumentBroker.cpp
+++ b/loolwsd/DocumentBroker.cpp
@@ -109,12 +109,12 @@ DocumentBroker::DocumentBroker() :
_lastSaveTime(std::chrono::steady_clock::now()),
_markToDestroy(true),
_lastEditableSession(true),
+ _isLoaded(false),
+ _isModified(false),
_cursorPosX(0),
_cursorPosY(0),
_cursorWidth(0),
_cursorHeight(0),
- _isLoaded(false),
- _isModified(false),
_mutex(),
_saveMutex(),
_tileVersion(0)
@@ -134,12 +134,12 @@ DocumentBroker::DocumentBroker(const Poco::URI& uriPublic,
_lastSaveTime(std::chrono::steady_clock::now()),
_markToDestroy(false),
_lastEditableSession(false),
+ _isLoaded(false),
+ _isModified(false),
_cursorPosX(0),
_cursorPosY(0),
_cursorWidth(0),
_cursorHeight(0),
- _isLoaded(false),
- _isModified(false),
_mutex(),
_saveMutex(),
_tileVersion(0)
@@ -244,7 +244,7 @@ bool DocumentBroker::save(bool success, const std::string& result)
// If we aren't destroying the last editable session just yet, and the file
// timestamp hasn't changed, skip saving.
const auto newFileModifiedTime = Poco::File(_storage->getLocalRootPath()).getLastModified();
- if (!isLastEditableSession() && newFileModifiedTime == _lastFileModifiedTime)
+ if (!_lastEditableSession && newFileModifiedTime == _lastFileModifiedTime)
{
// Nothing to do.
Log::debug() << "Skipping unnecessary saving to URI [" << uri
@@ -409,7 +409,7 @@ size_t DocumentBroker::addSession(std::shared_ptr<ClientSession>& session)
}
// Below values are recalculated when startDestroy() is called (before destroying the
- // document). It is safe to reset their values to their defaults whenever a new session is added
+ // document). It is safe to reset their values to their defaults whenever a new session is added.
_lastEditableSession = false;
_markToDestroy = false;
@@ -683,31 +683,32 @@ void DocumentBroker::handleTileCombinedResponse(const std::vector<char>& payload
}
}
-void DocumentBroker::startDestroy(const std::string& id)
+bool DocumentBroker::startDestroy(const std::string& id)
{
std::unique_lock<std::mutex> lock(_mutex);
- auto currentSession = _sessions.find(id);
+ const auto currentSession = _sessions.find(id);
assert(currentSession != _sessions.end());
- // Check if session which is being destroyed is last non-readonly session
- bool lastEditableSession = !currentSession->second->isReadOnly();
- for (auto& it: _sessions)
+ // Check if the session being destroyed is the last non-readonly session or not.
+ _lastEditableSession = !currentSession->second->isReadOnly();
+ if (_lastEditableSession && !_sessions.empty())
{
- if (it.second->getId() == id)
- continue;
-
- if (!it.second->isReadOnly())
+ for (const auto& it: _sessions)
{
- lastEditableSession = false;
+ if (it.second->getId() != id &&
+ !it.second->isReadOnly())
+ {
+ // Found another editable.
+ _lastEditableSession = false;
+ break;
+ }
}
}
- // Last editable session going away
- _lastEditableSession = lastEditableSession;
-
// Last view going away, can destroy.
_markToDestroy = (_sessions.size() <= 1);
+ return _lastEditableSession;
}
void DocumentBroker::setModified(const bool value)
diff --git a/loolwsd/DocumentBroker.hpp b/loolwsd/DocumentBroker.hpp
index 16008f4..4909e34 100644
--- a/loolwsd/DocumentBroker.hpp
+++ b/loolwsd/DocumentBroker.hpp
@@ -217,18 +217,16 @@ public:
const std::shared_ptr<ClientSession>& session);
void handleTileCombinedRequest(TileCombined& tileCombined,
const std::shared_ptr<ClientSession>& session);
-
void cancelTileRequests(const std::shared_ptr<ClientSession>& session);
-
void handleTileResponse(const std::vector<char>& payload);
void handleTileCombinedResponse(const std::vector<char>& payload);
- // Called before destroying any session
- // This method calculates and sets important states of
- // session being destroyed.
- void startDestroy(const std::string& id);
+ /// Called before destroying any session.
+ /// This method calculates and sets important states of
+ /// session being destroyed. Returns true if session id
+ /// is the last editable session.
+ bool startDestroy(const std::string& id);
bool isMarkedToDestroy() const { return _markToDestroy; }
- bool isLastEditableSession() const { return _lastEditableSession; }
bool handleInput(const std::vector<char>& payload);
@@ -256,12 +254,12 @@ private:
std::unique_ptr<TileCache> _tileCache;
std::atomic<bool> _markToDestroy;
std::atomic<bool> _lastEditableSession;
+ std::atomic<bool> _isLoaded;
+ std::atomic<bool> _isModified;
int _cursorPosX;
int _cursorPosY;
int _cursorWidth;
int _cursorHeight;
- bool _isLoaded;
- bool _isModified;
mutable std::mutex _mutex;
std::condition_variable _saveCV;
std::mutex _saveMutex;
diff --git a/loolwsd/LOOLWSD.cpp b/loolwsd/LOOLWSD.cpp
index d11b724..1889987 100644
--- a/loolwsd/LOOLWSD.cpp
+++ b/loolwsd/LOOLWSD.cpp
@@ -801,7 +801,7 @@ private:
Util::checkDiskSpaceOnRegisteredFileSystems();
- // Let messages flow
+ // Let messages flow.
IoUtil::SocketProcessor(ws,
[&session](const std::vector<char>& payload)
{
@@ -810,16 +810,17 @@ private:
[&session]() { session->closeFrame(); },
[]() { return !!TerminationFlag; });
+ // Connection terminated. Destroy session.
{
std::unique_lock<std::mutex> docBrokersLock(docBrokersMutex);
- // We cannot destroy it, before save, if this is the last session
+ // We cannot destroy it, before save, if this is the last session.
// Otherwise, we may end up removing the one and only session.
bool removedSession = false;
- docBroker->startDestroy(id);
// We issue a force-save when last editable (non-readonly) session is going away
- bool forceSave = docBroker->isLastEditableSession();
+ const bool forceSave = docBroker->startDestroy(id);
+
sessionsCount = docBroker->getSessionsCount();
if (sessionsCount > 1)
{
More information about the Libreoffice-commits
mailing list