[Libreoffice-commits] online.git: Branch 'distro/collabora/collabora-online-4-0-4' - kit/Kit.cpp
Libreoffice Gerrit user
logerrit at kemper.freedesktop.org
Fri May 3 12:37:56 UTC 2019
kit/Kit.cpp | 38 +++++++++++++++++++++++++-------------
1 file changed, 25 insertions(+), 13 deletions(-)
New commits:
commit fcafa15d5b7de74692f4e0046db8b20b8918cd28
Author: Michael Meeks <michael.meeks at collabora.com>
AuthorDate: Fri May 3 13:20:14 2019 +0100
Commit: Andras Timar <andras.timar at collabora.com>
CommitDate: Fri May 3 14:37:37 2019 +0200
Fix strange wire-id hash issues.
Remove un-used hash; and ensure that the hash <-> wid mapping is
suitably unique and helpful, even for duplicate identical tiles in
a single tilecombine.
Change-Id: I9c752032231e164765615a7c0d6338d6ff7e3fd5
Reviewed-on: https://gerrit.libreoffice.org/71740
Reviewed-by: Andras Timar <andras.timar at collabora.com>
Tested-by: Andras Timar <andras.timar at collabora.com>
diff --git a/kit/Kit.cpp b/kit/Kit.cpp
index 228af098e..05dbdc722 100644
--- a/kit/Kit.cpp
+++ b/kit/Kit.cpp
@@ -433,13 +433,15 @@ class PngCache
size_t _cacheSize;
static const size_t CacheSizeSoftLimit = (1024 * 4 * 32); // 128k of cache
static const size_t CacheSizeHardLimit = CacheSizeSoftLimit * 2;
+ static const size_t CacheWidHardLimit = 4096;
size_t _cacheHits;
size_t _cacheTests;
TileWireId _nextId;
DeltaGenerator _deltaGen;
- std::map< TileBinaryHash, CacheEntry > _cache;
- std::map< TileWireId, TileBinaryHash > _wireToHash;
+ std::unordered_map< TileBinaryHash, CacheEntry > _cache;
+ // This uses little storage so can be much larger
+ std::unordered_map< TileBinaryHash, TileWireId > _hashToWireId;
void clearCache(bool logStats = false)
{
@@ -447,6 +449,7 @@ class PngCache
LOG_DBG("cache clear " << _cache.size() << " items total size " <<
_cacheSize << " current hits " << _cacheHits);
_cache.clear();
+ _hashToWireId.clear();
_cacheSize = 0;
_cacheHits = 0;
_cacheTests = 0;
@@ -486,11 +489,6 @@ class PngCache
// Shrink cache when we exceed the size to maximize
// the chance of hitting these entries in the future.
_cacheSize -= it->second.getData()->size();
-
- auto wIt = _wireToHash.find(it->second.getWireId());
- assert(wIt != _wireToHash.end());
- _wireToHash.erase(wIt);
-
it = _cache.erase(it);
}
else
@@ -504,6 +502,20 @@ class PngCache
LOG_DBG("cache " << _cache.size() << " items total size " <<
_cacheSize << " after balance");
}
+
+ if (_hashToWireId.size() > CacheWidHardLimit)
+ {
+ LOG_DBG("Clear half of wid cache of size " << _hashToWireId.size());
+ TileWireId max = _nextId - CacheWidHardLimit/2;
+ for (auto it = _hashToWireId.begin(); it != _hashToWireId.end();)
+ {
+ if (it->second < max)
+ it = _hashToWireId.erase(it);
+ else
+ ++it;
+ }
+ LOG_DBG("Wid cache is now size " << _hashToWireId.size());
+ }
}
/// Lookup an entry in the cache and store the data in output.
@@ -574,18 +586,18 @@ public:
clearCache();
}
- TileWireId hashToWireId(TileBinaryHash id)
+ TileWireId hashToWireId(TileBinaryHash hash)
{
TileWireId wid;
- if (id == 0)
+ if (hash == 0)
return 0;
- auto it = _cache.find(id);
- if (it != _cache.end())
- wid = it->second.getWireId();
+ auto it = _hashToWireId.find(hash);
+ if (it != _hashToWireId.end())
+ wid = it->second;
else
{
wid = createNewWireId();
- _wireToHash.emplace(wid, id);
+ _hashToWireId.emplace(hash, wid);
}
return wid;
}
More information about the Libreoffice-commits
mailing list