[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