wsd/ClientSession.cpp | 35 ----------------------------------- wsd/ClientSession.hpp | 13 ------------- wsd/DocumentBroker.cpp | 9 +++------ wsd/TestStubs.cpp | 7 ------- wsd/TileCache.cpp | 28 +++++++++++++++------------- wsd/TileCache.hpp | 6 ++++-- 6 files changed, 22 insertions(+), 76 deletions(-)
New commits: commit 829e94b779afad5bc6192e54868ecbf17a61633f Author: Michael Meeks <michael.me...@collabora.com> AuthorDate: Sat Mar 2 19:26:08 2019 +0100 Commit: Michael Meeks <michael.me...@collabora.com> CommitDate: Sat Mar 2 21:42:34 2019 +0100 TileCache: remove redundant, expensive tracking in ClientSession. No need for all these call outs. removeOutdatedTileSubscriptions can't, Expect it is quicker now and more reliable to trace the tiles being rendered and count the waiters. Change-Id: I9724c7f38cf888b35c628857c0f11b51e74613ca diff --git a/wsd/ClientSession.cpp b/wsd/ClientSession.cpp index c0a02b806..c3d5b9a83 100644 --- a/wsd/ClientSession.cpp +++ b/wsd/ClientSession.cpp @@ -1315,39 +1315,4 @@ void ClientSession::traceTileBySend(const TileDesc& tile, bool deduplicated) addTileOnFly(tile); } -void ClientSession::traceSubscribeToTile(const std::string& cacheName) -{ - _tilesBeingRendered.insert(cacheName); -} - -void ClientSession::traceUnSubscribeToTile(const std::string& cacheName) -{ - _tilesBeingRendered.erase(cacheName); -} - -void ClientSession::removeOutdatedTileSubscriptions() -{ - const std::shared_ptr<DocumentBroker> docBroker = getDocumentBroker(); - if(!docBroker) - return; - - auto iterator = _tilesBeingRendered.begin(); - while(iterator != _tilesBeingRendered.end()) - { - double elapsedTime = docBroker->tileCache().getTileBeingRenderedElapsedTimeMs(*iterator); - if(elapsedTime < 0.0 && elapsedTime > 200.0) - { - LOG_INF("Tracked TileBeingRendered was dropped because of time out."); - _tilesBeingRendered.erase(iterator); - } - else - ++iterator; - } -} - -void ClientSession::clearTileSubscription() -{ - _tilesBeingRendered.clear(); -} - /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/wsd/ClientSession.hpp b/wsd/ClientSession.hpp index 827a0f857..8db5b3718 100644 --- a/wsd/ClientSession.hpp +++ b/wsd/ClientSession.hpp @@ -21,7 +21,6 @@ #include <map> #include <list> #include <utility> -#include <unordered_set> class DocumentBroker; @@ -130,14 +129,6 @@ public: /// Call this method anytime when a new tile is sent to the client void traceTileBySend(const TileDesc& tile, bool deduplicated = false); - /// Trask tiles what we a subscription to - void traceSubscribeToTile(const std::string& tileCacheName); - void traceUnSubscribeToTile(const std::string& tileCacheName); - void removeOutdatedTileSubscriptions(); - void clearTileSubscription(); - - size_t getTilesBeingRenderedCount() const {return _tilesBeingRendered.size();} - /// Clear wireId map anytime when client visible area changes (visible area, zoom, part number) void resetWireIdMap(); @@ -227,10 +218,6 @@ private: /// TileID's of the sent tiles. Push by sending and pop by tileprocessed message from the client. 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) - std::unordered_set<std::string> _tilesBeingRendered; - /// Requested tiles are stored in this list, before we can send them to the client std::deque<TileDesc> _requestedTiles; diff --git a/wsd/DocumentBroker.cpp b/wsd/DocumentBroker.cpp index 8f058bd2c..888500de8 100644 --- a/wsd/DocumentBroker.cpp +++ b/wsd/DocumentBroker.cpp @@ -1462,9 +1462,6 @@ void DocumentBroker::sendRequestedTiles(const std::shared_ptr<ClientSession>& se tilesOnFlyUpperLimit = 200; // Have a big number here to get all tiles requested by file openning } - - // Update client's tilesBeingRendered list - session->removeOutdatedTileSubscriptions(); // Drop tiles which we are waiting for too long session->removeOutdatedTilesOnFly(); @@ -1475,7 +1472,8 @@ void DocumentBroker::sendRequestedTiles(const std::shared_ptr<ClientSession>& se { size_t delayedTiles = 0; std::vector<TileDesc> tilesNeedsRendering; - while(session->getTilesOnFlyCount() + session->getTilesBeingRenderedCount() < tilesOnFlyUpperLimit && + size_t beingRendered = _tileCache->countTilesBeingRenderedForSession(session); + while(session->getTilesOnFlyCount() + beingRendered < tilesOnFlyUpperLimit && !requestedTiles.empty() && // If we delayed all tiles we don't send any tile (we will when next tileprocessed message arrives) delayedTiles < requestedTiles.size()) @@ -1516,6 +1514,7 @@ void DocumentBroker::sendRequestedTiles(const std::shared_ptr<ClientSession>& se _debugRenderedTileCount++; } tileCache().subscribeToTileRendering(tile, session); + beingRendered++; } requestedTiles.pop_front(); } @@ -1542,8 +1541,6 @@ void DocumentBroker::cancelTileRequests(const std::shared_ptr<ClientSession>& se session->getRequestedTiles().clear(); - session->clearTileSubscription(); - session->resetWireIdMap(); const std::string canceltiles = tileCache().cancelTiles(session); diff --git a/wsd/TestStubs.cpp b/wsd/TestStubs.cpp index 405b7a6c4..68b6f8d95 100644 --- a/wsd/TestStubs.cpp +++ b/wsd/TestStubs.cpp @@ -19,15 +19,8 @@ void DocumentBroker::assertCorrectThread() const {} - void ClientSession::traceTileBySend(const TileDesc& /*tile*/, bool /*deduplicated = false*/) {} -void ClientSession::traceSubscribeToTile(const std::string& /*tileCacheName*/) {}; - -void ClientSession::traceUnSubscribeToTile(const std::string& /*tileCacheName*/) {}; - -void ClientSession::clearTileSubscription() {}; - void ClientSession::enqueueSendMessage(const std::shared_ptr<Message>& /*data*/) {}; /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/wsd/TileCache.cpp b/wsd/TileCache.cpp index b8e138563..6ca40c9f9 100644 --- a/wsd/TileCache.cpp +++ b/wsd/TileCache.cpp @@ -98,6 +98,19 @@ private: std::string _cachedName; }; +size_t TileCache::countTilesBeingRenderedForSession(const std::shared_ptr<ClientSession>& session) +{ + size_t count = 0; + for (auto &it : _tilesBeingRendered) + { + for (auto &s : it.second->getSubscribers()) { + if (s.lock() == session) + count++; + } + } + return count; +} + std::shared_ptr<TileCache::TileBeingRendered> TileCache::findTileBeingRendered(const TileDesc& tileDesc) { const std::string cachedName = cacheFileName(tileDesc); @@ -108,19 +121,12 @@ std::shared_ptr<TileCache::TileBeingRendered> TileCache::findTileBeingRendered(c return tile != _tilesBeingRendered.end() ? tile->second : nullptr; } -void TileCache::forgetTileBeingRendered(const std::shared_ptr<TileCache::TileBeingRendered>& tileBeingRendered, const TileDesc& tile) +void TileCache::forgetTileBeingRendered(const std::shared_ptr<TileCache::TileBeingRendered>& tileBeingRendered) { assertCorrectThread(); assert(tileBeingRendered); assert(_tilesBeingRendered.find(tileBeingRendered->getCacheName()) != _tilesBeingRendered.end()); - for(auto& subscriber : tileBeingRendered->getSubscribers()) - { - std::shared_ptr<ClientSession> session = subscriber.lock(); - if(session && tile.getId() == -1) - session->traceUnSubscribeToTile(tileBeingRendered->getCacheName()); - } - _tilesBeingRendered.erase(tileBeingRendered->getCacheName()); } @@ -244,7 +250,7 @@ void TileCache::saveTileAndNotify(const TileDesc& tile, const char *data, const { LOG_DBG("STATISTICS: tile " << tile.getVersion() << " internal roundtrip " << tileBeingRendered->getElapsedTimeMs() << " ms."); - forgetTileBeingRendered(tileBeingRendered, tile); + forgetTileBeingRendered(tileBeingRendered); } } else @@ -439,8 +445,6 @@ void TileCache::subscribeToTileRendering(const TileDesc& tile, const std::shared LOG_DBG("Subscribing " << subscriber->getName() << " to tile " << name << " which has " << tileBeingRendered->getSubscribers().size() << " subscribers already."); tileBeingRendered->getSubscribers().push_back(subscriber); - if(tile.getId() == -1) - subscriber->traceSubscribeToTile(tileBeingRendered->getCacheName()); const auto duration = (std::chrono::steady_clock::now() - tileBeingRendered->getStartTime()); if (std::chrono::duration_cast<std::chrono::milliseconds>(duration).count() > COMMAND_TIMEOUT_MS) @@ -460,8 +464,6 @@ void TileCache::subscribeToTileRendering(const TileDesc& tile, const std::shared tileBeingRendered = std::make_shared<TileBeingRendered>(cachedName, tile); tileBeingRendered->getSubscribers().push_back(subscriber); - if(tile.getId() == -1) - subscriber->traceSubscribeToTile(tileBeingRendered->getCacheName()); _tilesBeingRendered[cachedName] = tileBeingRendered; } } diff --git a/wsd/TileCache.hpp b/wsd/TileCache.hpp index fe5a7ca34..70dc04fa1 100644 --- a/wsd/TileCache.hpp +++ b/wsd/TileCache.hpp @@ -85,11 +85,13 @@ public: /// Parse invalidateTiles message to a part number and a rectangle of the invalidated area static std::pair<int, Util::Rectangle> parseInvalidateMsg(const std::string& tiles); - void forgetTileBeingRendered(const std::shared_ptr<TileCache::TileBeingRendered>& tileBeingRendered, const TileDesc& tile); + void forgetTileBeingRendered(const std::shared_ptr<TileCache::TileBeingRendered>& tileBeingRendered); double getTileBeingRenderedElapsedTimeMs(const std::string& tileCacheName) const; + size_t countTilesBeingRenderedForSession(const std::shared_ptr<ClientSession>& subscriber); + bool hasTileBeingRendered(const TileDesc& tile); - int getTileBeingRenderedVersion(const TileDesc& tile); + int getTileBeingRenderedVersion(const TileDesc& tile); // Debugging bits ... void dumpState(std::ostream& os); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits