summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Firebaugh <john.firebaugh@gmail.com>2014-07-21 13:43:59 -0700
committerJohn Firebaugh <john.firebaugh@gmail.com>2014-07-21 13:43:59 -0700
commitfb151b3fbe2ed25d5255c4b532a041e868086011 (patch)
tree415ba430665cbf451b69cee57aa9f305ac537bfc
parent4a110ff17e994a07a36a1d4bedf18f5e6c6dbb6a (diff)
downloadqtlocation-mapboxgl-fb151b3fbe2ed25d5255c4b532a041e868086011.tar.gz
Fix sprite->pos data race
-rw-r--r--include/mbgl/map/sprite.hpp3
-rw-r--r--src/map/sprite.cpp16
2 files changed, 11 insertions, 8 deletions
diff --git a/include/mbgl/map/sprite.hpp b/include/mbgl/map/sprite.hpp
index 22126eb6a1..c4f27a3ee9 100644
--- a/include/mbgl/map/sprite.hpp
+++ b/include/mbgl/map/sprite.hpp
@@ -55,7 +55,8 @@ private:
std::string url;
std::string body;
std::string image;
- std::atomic<bool> loaded;
+ std::atomic<bool> loadedImage;
+ std::atomic<bool> loadedJSON;
std::unordered_map<std::string, SpritePosition> pos;
const SpritePosition empty;
};
diff --git a/src/map/sprite.cpp b/src/map/sprite.cpp
index fd8a4ec7b5..60f19ab006 100644
--- a/src/map/sprite.cpp
+++ b/src/map/sprite.cpp
@@ -24,11 +24,14 @@ Sprite::Sprite(Map &map, float pixelRatio)
: pixelRatio(pixelRatio),
raster(),
map(map),
- loaded(false) {
+ loadedImage(false),
+ loadedJSON(false) {
}
void Sprite::load(const std::string& base_url) {
- loaded = false;
+ loadedImage = false;
+ loadedJSON = false;
+
url = base_url;
std::shared_ptr<Sprite> sprite = shared_from_this();
@@ -56,17 +59,14 @@ void Sprite::load(const std::string& base_url) {
}
void Sprite::complete(std::shared_ptr<Sprite> &sprite) {
- const bool raster = bool(sprite->raster);
- const bool json = bool(sprite->pos.size());
- if (raster && json && !sprite->loaded) {
- sprite->loaded = true;
+ if (sprite->loadedImage && sprite->loadedJSON) {
sprite->map.update();
Log::Info(Event::Sprite, "loaded %s", sprite->url.c_str());
}
}
bool Sprite::isLoaded() const {
- return loaded;
+ return loadedImage && loadedJSON;
}
void Sprite::asyncParseImage() {
@@ -80,6 +80,7 @@ void Sprite::asyncParseJSON() {
void Sprite::parseImage(std::shared_ptr<Sprite> &sprite) {
sprite->raster = std::make_unique<util::Image>(sprite->image);
sprite->image.clear();
+ sprite->loadedImage = true;
}
void Sprite::parseJSON(std::shared_ptr<Sprite> &sprite) {
@@ -111,6 +112,7 @@ void Sprite::parseJSON(std::shared_ptr<Sprite> &sprite) {
}
sprite->pos.swap(pos);
+ sprite->loadedJSON = true;
}
}