[Libreoffice-commits] online.git: loolwsd/DocumentBroker.cpp loolwsd/DocumentBroker.hpp loolwsd/PrisonerSession.cpp loolwsd/test loolwsd/TileCache.cpp loolwsd/TileCache.hpp
Ashod Nakashian
ashod.nakashian at collabora.co.uk
Mon May 23 01:57:34 UTC 2016
loolwsd/DocumentBroker.cpp | 27 +++++++++++++++++++++++----
loolwsd/DocumentBroker.hpp | 9 +++++++++
loolwsd/PrisonerSession.cpp | 17 +++++++++++++++++
loolwsd/TileCache.cpp | 9 ++++++---
loolwsd/TileCache.hpp | 2 +-
loolwsd/test/TileCacheTests.cpp | 2 +-
6 files changed, 57 insertions(+), 9 deletions(-)
New commits:
commit 157386e3bc6a42b03393105e85da4a8fae074d1b
Author: Ashod Nakashian <ashod.nakashian at collabora.co.uk>
Date: Sun May 22 16:47:22 2016 -0400
loolwsd: process tiles under the cursor with priority
Change-Id: I7993ee049c5c0835cae588ff54163f135c4f8b02
Reviewed-on: https://gerrit.libreoffice.org/25345
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 10600da..fe4d715 100644
--- a/loolwsd/DocumentBroker.cpp
+++ b/loolwsd/DocumentBroker.cpp
@@ -108,6 +108,8 @@ DocumentBroker::DocumentBroker(const Poco::URI& uriPublic,
_childProcess(childProcess),
_lastSaveTime(std::chrono::steady_clock::now()),
_markToDestroy(false),
+ _cursorPosX(0),
+ _cursorPosY(0),
_isLoaded(false),
_isModified(false),
_tileVersion(0)
@@ -507,7 +509,19 @@ void DocumentBroker::handleTileCombinedRequest(TileCombined& tileCombined,
const auto ver = tileCache().isTileBeingRenderedIfSoSubscribe(tile, session);
if (ver <= 0)
{
- // Skip.
+ // Already rendering. Skip.
+ tiles.erase(tiles.begin() + i);
+ }
+ else
+ if (_cursorPosX >= tile.getTilePosX() && _cursorPosX <= tile.getTilePosX() + tile.getTileWidth() &&
+ _cursorPosY >= tile.getTilePosY() && _cursorPosY <= tile.getTilePosY() + tile.getTileHeight())
+ {
+ // If this tile is right under the cursor, give it priority.
+ const auto req = tile.serialize("tile");
+ Log::debug() << "Priority tile request: " << req << Log::end;
+ _childProcess->getWebSocket()->sendFrame(req.data(), req.size());
+
+ // No need to process with the group anymore.
tiles.erase(tiles.begin() + i);
}
}
@@ -536,9 +550,14 @@ void DocumentBroker::handleTileResponse(const std::vector<char>& payload)
const auto buffer = payload.data();
const auto length = payload.size();
- if(firstLine.size() < static_cast<std::string::size_type>(length) - 1)
+ if (firstLine.size() < static_cast<std::string::size_type>(length) - 1)
{
- tileCache().saveTileAndNotify(tile, buffer + firstLine.size() + 1, length - firstLine.size() - 1);
+ // If the tile right under the cursor, give it priority.
+ const auto priority = (_cursorPosX >= tile.getTilePosX() &&
+ _cursorPosX <= tile.getTilePosX() + tile.getTileWidth() &&
+ _cursorPosY >= tile.getTilePosY() &&
+ _cursorPosY <= tile.getTilePosY() + tile.getTileHeight());
+ tileCache().saveTileAndNotify(tile, buffer + firstLine.size() + 1, length - firstLine.size() - 1, priority);
}
else
{
@@ -571,7 +590,7 @@ void DocumentBroker::handleTileCombinedResponse(const std::vector<char>& payload
{
for (const auto& tile : tileCombined.getTiles())
{
- tileCache().saveTileAndNotify(tile, buffer + offset, tile.getImgSize());
+ tileCache().saveTileAndNotify(tile, buffer + offset, tile.getImgSize(), false);
offset += tile.getImgSize();
}
}
diff --git a/loolwsd/DocumentBroker.hpp b/loolwsd/DocumentBroker.hpp
index 3c2a342..7832ff4 100644
--- a/loolwsd/DocumentBroker.hpp
+++ b/loolwsd/DocumentBroker.hpp
@@ -202,6 +202,13 @@ public:
/// Removes a session by ID. Returns the new number of sessions.
size_t removeSession(const std::string& id);
+ /// Invalidate the cursor position.
+ void invalidateCursor(const int x, const int y)
+ {
+ _cursorPosX = x;
+ _cursorPosY = y;
+ }
+
void handleTileRequest(TileDesc& tile,
const std::shared_ptr<ClientSession>& session);
void handleTileCombinedRequest(TileCombined& tileCombined,
@@ -239,6 +246,8 @@ private:
std::unique_ptr<StorageBase> _storage;
std::unique_ptr<TileCache> _tileCache;
std::atomic<bool> _markToDestroy;
+ int _cursorPosX;
+ int _cursorPosY;
bool _isLoaded;
bool _isModified;
mutable std::mutex _mutex;
diff --git a/loolwsd/PrisonerSession.cpp b/loolwsd/PrisonerSession.cpp
index 9933e6c..9dd096d 100644
--- a/loolwsd/PrisonerSession.cpp
+++ b/loolwsd/PrisonerSession.cpp
@@ -204,6 +204,23 @@ bool PrisonerSession::_handleInput(const char *buffer, int length)
assert(firstLine.size() == static_cast<std::string::size_type>(length));
_docBroker->tileCache().invalidateTiles(firstLine);
}
+ else if (tokens[0] == "invalidatecursor:")
+ {
+ assert(firstLine.size() == static_cast<std::string::size_type>(length));
+ StringTokenizer tokens(firstLine, " ", StringTokenizer::TOK_IGNORE_EMPTY | StringTokenizer::TOK_TRIM);
+ int x = 0;
+ int y = 0;
+ if (tokens.count() > 2 &&
+ stringToInteger(tokens[1], x) &&
+ stringToInteger(tokens[2], y))
+ {
+ _docBroker->invalidateCursor(x, y);
+ }
+ else
+ {
+ Log::error("Unable to parse " + firstLine);
+ }
+ }
else if (tokens[0] == "renderfont:")
{
std::string font;
diff --git a/loolwsd/TileCache.cpp b/loolwsd/TileCache.cpp
index c006bc1..6a6dc79 100644
--- a/loolwsd/TileCache.cpp
+++ b/loolwsd/TileCache.cpp
@@ -135,12 +135,12 @@ std::unique_ptr<std::fstream> TileCache::lookupTile(const TileDesc& tile)
return nullptr;
}
-void TileCache::saveTileAndNotify(const TileDesc& tile, const char *data, size_t size)
+void TileCache::saveTileAndNotify(const TileDesc& tile, const char *data, const size_t size, const bool priority)
{
std::unique_lock<std::mutex> lock(_tilesBeingRenderedMutex);
std::shared_ptr<TileBeingRendered> tileBeingRendered = findTileBeingRendered(tile);
- if (tileBeingRendered && tileBeingRendered->getVersion() != tile.getVersion())
+ if (!priority && tileBeingRendered && tileBeingRendered->getVersion() != tile.getVersion())
{
Log::trace() << "Skipping unexpected tile ver: " << tile.getVersion()
<< ", waiting for ver " << tileBeingRendered->getVersion() << Log::end;
@@ -179,7 +179,10 @@ void TileCache::saveTileAndNotify(const TileDesc& tile, const char *data, size_t
}
// Remove subscriptions.
- _tilesBeingRendered.erase(cachedName);
+ if (tileBeingRendered->getVersion() == tile.getVersion())
+ {
+ _tilesBeingRendered.erase(cachedName);
+ }
}
}
diff --git a/loolwsd/TileCache.hpp b/loolwsd/TileCache.hpp
index 0867d96..b1194bb 100644
--- a/loolwsd/TileCache.hpp
+++ b/loolwsd/TileCache.hpp
@@ -44,7 +44,7 @@ public:
std::unique_ptr<std::fstream> lookupTile(const TileDesc& tile);
- void saveTileAndNotify(const TileDesc& tile, const char *data, size_t size);
+ void saveTileAndNotify(const TileDesc& tile, const char *data, const size_t size, const bool priority);
std::string getTextFile(const std::string& fileName);
diff --git a/loolwsd/test/TileCacheTests.cpp b/loolwsd/test/TileCacheTests.cpp
index 6a7adca..bd2c307 100644
--- a/loolwsd/test/TileCacheTests.cpp
+++ b/loolwsd/test/TileCacheTests.cpp
@@ -145,7 +145,7 @@ void TileCacheTests::testSimple()
// Cache Tile
const auto size = 1024;
const auto data = genRandomData(size);
- tc.saveTileAndNotify(tile, data.data(), size);
+ tc.saveTileAndNotify(tile, data.data(), size, true);
// Find Tile
file = tc.lookupTile(tile);
More information about the Libreoffice-commits
mailing list