fixes #1308: normalize tile memory cache keys & allow dupe inserts
This commit is contained in:
committed by
John Firebaugh
parent
55118e5bd7
commit
b43ba4089c
@@ -245,7 +245,7 @@ TileData::State Source::addTile(Map &map, Worker &worker,
|
||||
}
|
||||
|
||||
if (!new_tile.data) {
|
||||
new_tile.data = cache.get(id.to_uint64());
|
||||
new_tile.data = cache.get(normalized_id.to_uint64());
|
||||
}
|
||||
|
||||
if (!new_tile.data) {
|
||||
@@ -418,7 +418,7 @@ void Source::update(Map &map,
|
||||
if (!obsolete) {
|
||||
retain_data.insert(tile.data->id);
|
||||
} else if (type != SourceType::Raster && tile.data->ready()) {
|
||||
tileCache.add(tile.id.to_uint64(), tile.data);
|
||||
tileCache.add(tile.id.normalized().to_uint64(), tile.data);
|
||||
}
|
||||
return obsolete;
|
||||
});
|
||||
@@ -432,7 +432,7 @@ void Source::update(Map &map,
|
||||
|
||||
bool obsolete = retain_data.find(tile->id) == retain_data.end();
|
||||
if (obsolete) {
|
||||
if (!tileCache.has(tile->id.to_uint64())) {
|
||||
if (!tileCache.has(tile->id.normalized().to_uint64())) {
|
||||
tile->cancel();
|
||||
}
|
||||
return true;
|
||||
|
||||
@@ -20,11 +20,16 @@ void TileCache::setSize(size_t size_) {
|
||||
|
||||
void TileCache::add(uint64_t key, std::shared_ptr<TileData> data) {
|
||||
|
||||
assert(tiles.find(key) == tiles.end());
|
||||
// insert new or query existing data
|
||||
if (tiles.emplace(key, data).second) {
|
||||
// remove existing data key
|
||||
orderedKeys.remove(key);
|
||||
}
|
||||
|
||||
tiles.emplace(key, data);
|
||||
// (re-)insert data key as newest
|
||||
orderedKeys.push_back(key);
|
||||
|
||||
// purge oldest key/data if necessary
|
||||
if (orderedKeys.size() > size) {
|
||||
get(orderedKeys.front());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user