diff options
author | Thiago Marcos P. Santos <tmpsantos@gmail.com> | 2018-04-25 15:22:00 -0700 |
---|---|---|
committer | Thiago Marcos P. Santos <tmpsantos@gmail.com> | 2018-04-26 11:07:48 -0700 |
commit | 0767bf06869c380305c57df1b69d74fac5a6c94a (patch) | |
tree | d9ae1f21c5933531e9f1e05ed0e38cbb171773d7 | |
parent | 0eb58278f21c7d767b07449b6b167c6859283d5d (diff) | |
download | qtlocation-mapboxgl-0767bf06869c380305c57df1b69d74fac5a6c94a.tar.gz |
[qt] Only share a FileSource if it points to the same path
Previously all QMapboxGL objects were sharing the same cache created
by the first instantiated object. Now it will share the cache only
if it points to the same path.
Fixes #11766
-rw-r--r-- | platform/qt/src/qmapboxgl.cpp | 37 |
1 files changed, 27 insertions, 10 deletions
diff --git a/platform/qt/src/qmapboxgl.cpp b/platform/qt/src/qmapboxgl.cpp index e2c1b31eea..8c3355dc09 100644 --- a/platform/qt/src/qmapboxgl.cpp +++ b/platform/qt/src/qmapboxgl.cpp @@ -89,15 +89,33 @@ QThreadStorage<std::shared_ptr<mbgl::util::RunLoop>> loop; std::shared_ptr<mbgl::DefaultFileSource> sharedDefaultFileSource( const std::string& cachePath, const std::string& assetRoot, uint64_t maximumCacheSize) { - static std::weak_ptr<mbgl::DefaultFileSource> weak; - auto fs = weak.lock(); + static std::mutex mutex; + static std::unordered_map<std::string, std::weak_ptr<mbgl::DefaultFileSource>> fileSources; - if (!fs) { - weak = fs = std::make_shared<mbgl::DefaultFileSource>( - cachePath, assetRoot, maximumCacheSize); + std::lock_guard<std::mutex> lock(mutex); + + // Purge entries no longer in use. + for (auto it = fileSources.begin(); it != fileSources.end();) { + if (!it->second.lock()) { + it = fileSources.erase(it); + } else { + ++it; + } } - return fs; + // Return an existing FileSource if available. + auto sharedFileSource = fileSources.find(cachePath); + if (sharedFileSource != fileSources.end()) { + return sharedFileSource->second.lock(); + } + + // New path, create a new FileSource. + auto newFileSource = std::make_shared<mbgl::DefaultFileSource>( + cachePath, assetRoot, maximumCacheSize); + + fileSources[cachePath] = newFileSource; + + return newFileSource; } // Conversion helper functions. @@ -141,10 +159,9 @@ std::unique_ptr<mbgl::style::Image> toStyleImage(const QString &id, const QImage QMapboxGLSettings is used to configure QMapboxGL at the moment of its creation. Once created, the QMapboxGLSettings of a QMapboxGL can no longer be changed. - Cache-related settings are shared between all QMapboxGL instances because different - maps will share the same cache database file. The first map to configure cache properties - such as size and path will force the configuration to all newly instantiated QMapboxGL - objects. + Cache-related settings are shared between all QMapboxGL instances using the same cache path. + The first map to configure cache properties such as size will force the configuration + to all newly instantiated QMapboxGL objects using the same cache in the same process. \since 4.7 */ |