[Libreoffice-commits] online.git: wsd/ClientSession.cpp wsd/ClientSession.hpp

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Thu Aug 23 11:45:35 UTC 2018


 wsd/ClientSession.cpp |   20 ++++++++++++++++----
 wsd/ClientSession.hpp |    5 +++--
 2 files changed, 19 insertions(+), 6 deletions(-)

New commits:
commit 185b933353c670ef4639ada323ed2f803f209e70
Author:     Tamás Zolnai <tamas.zolnai at collabora.com>
AuthorDate: Thu Aug 23 13:27:47 2018 +0200
Commit:     Tamás Zolnai <tamas.zolnai at collabora.com>
CommitDate: Thu Aug 23 13:44:39 2018 +0200

    Go back using list for tilesOnFly
    
    It can handle duplicates which we need to have.
    
    Change-Id: Ia4cd813dd173bc538dd27953c4886d460b5b1c49

diff --git a/wsd/ClientSession.cpp b/wsd/ClientSession.cpp
index 406e24255..588a17ad5 100644
--- a/wsd/ClientSession.cpp
+++ b/wsd/ClientSession.cpp
@@ -343,8 +343,15 @@ bool ClientSession::_handleInput(const char *buffer, int length)
             return false;
         }
 
-        size_t retValue = _tilesOnFly.erase(tileID);
-        if(retValue == 0)
+        auto iter = std::find_if(_tilesOnFly.begin(), _tilesOnFly.end(),
+        [&tileID](const std::pair<std::string, std::chrono::steady_clock::time_point>& curTile)
+        {
+            return curTile.first == tileID;
+        });
+
+        if(iter != _tilesOnFly.end())
+            _tilesOnFly.erase(iter);
+        else
             LOG_WRN("Tileprocessed message with an unknown tile ID");
 
         docBroker->sendRequestedTiles(shared_from_this());
@@ -1041,7 +1048,7 @@ Authorization ClientSession::getAuthorization() const
 
 void ClientSession::addTileOnFly(const TileDesc& tile)
 {
-    _tilesOnFly.insert({generateTileID(tile), std::chrono::steady_clock::now()});
+    _tilesOnFly.push_back({generateTileID(tile), std::chrono::steady_clock::now()});
 }
 
 void ClientSession::clearTilesOnFly()
@@ -1051,14 +1058,19 @@ void ClientSession::clearTilesOnFly()
 
 void ClientSession::removeOutdatedTilesOnFly()
 {
-    for(auto tileIter = _tilesOnFly.begin(); tileIter != _tilesOnFly.end(); ++tileIter)
+    // Check only the beginning of the list, tiles are ordered by timestamp
+    bool continueLoop = true;
+    while(!_tilesOnFly.empty() && continueLoop)
     {
+        auto tileIter = _tilesOnFly.begin();
         double elapsedTimeMs = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now() - tileIter->second).count();
         if(elapsedTimeMs > 3000)
         {
             LOG_WRN("Tracker tileID was dropped because of time out. Tileprocessed message did not arrive");
             _tilesOnFly.erase(tileIter);
         }
+        else
+            continueLoop = false;
     }
 }
 
diff --git a/wsd/ClientSession.hpp b/wsd/ClientSession.hpp
index 6f55494b2..b4835cfd9 100644
--- a/wsd/ClientSession.hpp
+++ b/wsd/ClientSession.hpp
@@ -19,7 +19,8 @@
 #include <Rectangle.hpp>
 #include <deque>
 #include <map>
-#include <unordered_map>
+#include <list>
+#include <utility>
 #include <unordered_set>
 
 class DocumentBroker;
@@ -232,7 +233,7 @@ private:
     bool _isTextDocument;
 
     /// TileID's of the sent tiles. Push by sending and pop by tileprocessed message from the client.
-    std::unordered_map<std::string, std::chrono::steady_clock::time_point> _tilesOnFly;
+    std::list<std::pair<std::string, std::chrono::steady_clock::time_point>> _tilesOnFly;
 
     /// Names of tiles requested from kit, which this session is subsrcibed to
     /// Track only non-thumbnail tiles (getId() == -1)


More information about the Libreoffice-commits mailing list