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.nakash...@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 <ashnak...@gmail.com> Tested-by: Ashod Nakashian <ashnak...@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); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits