summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKonstantin Käfer <mail@kkaefer.com>2015-10-16 16:14:55 +0200
committerKonstantin Käfer <mail@kkaefer.com>2015-10-26 15:54:27 +0100
commit5173bf1bb8d21054b0dd6251d23eb37323d6c525 (patch)
treed13536c22b8279e9fd7e8f4892596c42973170f3 /src
parent4e3503ea6cf30c55a2cc86f78c4a607bd14f1c41 (diff)
downloadqtlocation-mapboxgl-5173bf1bb8d21054b0dd6251d23eb37323d6c525.tar.gz
[core] Make response data shared to avoid excessive copying
Diffstat (limited to 'src')
-rw-r--r--src/mbgl/map/map_context.cpp2
-rw-r--r--src/mbgl/map/source.cpp2
-rw-r--r--src/mbgl/map/sprite.cpp20
-rw-r--r--src/mbgl/map/sprite.hpp5
-rw-r--r--src/mbgl/map/vector_tile_data.hpp2
-rw-r--r--src/mbgl/storage/default_file_source.cpp1
-rw-r--r--src/mbgl/text/glyph_pbf.cpp5
-rw-r--r--src/mbgl/text/glyph_pbf.hpp2
-rw-r--r--src/mbgl/util/worker.cpp12
-rw-r--r--src/mbgl/util/worker.hpp4
10 files changed, 22 insertions, 33 deletions
diff --git a/src/mbgl/map/map_context.cpp b/src/mbgl/map/map_context.cpp
index b197ea12f3..11d631a57a 100644
--- a/src/mbgl/map/map_context.cpp
+++ b/src/mbgl/map/map_context.cpp
@@ -113,7 +113,7 @@ void MapContext::setStyleURL(const std::string& url) {
styleRequest = nullptr;
if (res.status == Response::Successful) {
- loadStyleJSON(res.data, base);
+ loadStyleJSON(*res.data, base);
} else if (res.status == Response::NotFound && styleURL.find("mapbox://") == 0) {
Log::Error(Event::Setup, "style %s could not be found or is an incompatible legacy map or style", styleURL.c_str());
} else {
diff --git a/src/mbgl/map/source.cpp b/src/mbgl/map/source.cpp
index 7e30682895..551a9eb190 100644
--- a/src/mbgl/map/source.cpp
+++ b/src/mbgl/map/source.cpp
@@ -163,7 +163,7 @@ void Source::load() {
}
rapidjson::Document d;
- d.Parse<0>(res.data.c_str());
+ d.Parse<0>(res.data->c_str());
if (d.HasParseError()) {
std::stringstream message;
diff --git a/src/mbgl/map/sprite.cpp b/src/mbgl/map/sprite.cpp
index a54d96f005..cbd8c44338 100644
--- a/src/mbgl/map/sprite.cpp
+++ b/src/mbgl/map/sprite.cpp
@@ -20,10 +20,8 @@
namespace mbgl {
struct Sprite::Loader {
- bool loadedJSON = false;
- bool loadedImage = false;
- std::unique_ptr<Data> data = std::make_unique<Data>();
-
+ std::shared_ptr<const std::string> image;
+ std::shared_ptr<const std::string> json;
RequestHolder jsonRequest;
RequestHolder spriteRequest;
};
@@ -50,8 +48,7 @@ Sprite::Sprite(const std::string& baseUrl, float pixelRatio_)
}
loader->jsonRequest = nullptr;
if (res.status == Response::Successful) {
- loader->data->json = res.data;
- loader->loadedJSON = true;
+ loader->json = res.data;
} else {
std::stringstream message;
message << "Failed to load [" << jsonURL << "]: " << res.message;
@@ -70,8 +67,7 @@ Sprite::Sprite(const std::string& baseUrl, float pixelRatio_)
}
loader->spriteRequest = nullptr;
if (res.status == Response::Successful) {
- loader->data->image = res.data;
- loader->loadedImage = true;
+ loader->image = res.data;
} else {
std::stringstream message;
message << "Failed to load [" << spriteURL << "]: " << res.message;
@@ -88,14 +84,12 @@ Sprite::~Sprite() {
void Sprite::emitSpriteLoadedIfComplete() {
assert(loader);
- if (!loader->loadedImage || !loader->loadedJSON || !observer) {
+ if (!loader->image || !loader->json || !observer) {
return;
}
- std::unique_ptr<Data> data(std::move(loader->data));
- loader.reset();
-
- auto result = parseSprite(data->image, data->json);
+ auto local = std::move(loader);
+ auto result = parseSprite(*local->image, *local->json);
if (result.is<Sprites>()) {
loaded = true;
observer->onSpriteLoaded(result.get<Sprites>());
diff --git a/src/mbgl/map/sprite.hpp b/src/mbgl/map/sprite.hpp
index 32fa16de12..47ce1dbc8b 100644
--- a/src/mbgl/map/sprite.hpp
+++ b/src/mbgl/map/sprite.hpp
@@ -19,11 +19,6 @@ class Request;
class Sprite : private util::noncopyable {
public:
- struct Data {
- std::string image;
- std::string json;
- };
-
class Observer {
public:
virtual ~Observer() = default;
diff --git a/src/mbgl/map/vector_tile_data.hpp b/src/mbgl/map/vector_tile_data.hpp
index 1a1ff84061..9b4fa8622b 100644
--- a/src/mbgl/map/vector_tile_data.hpp
+++ b/src/mbgl/map/vector_tile_data.hpp
@@ -42,7 +42,7 @@ private:
bool parsing = false;
const SourceInfo& source;
RequestHolder req;
- std::string data;
+ std::shared_ptr<const std::string> data;
float lastAngle = 0;
float currentAngle;
float lastPitch = 0;
diff --git a/src/mbgl/storage/default_file_source.cpp b/src/mbgl/storage/default_file_source.cpp
index 5d698fc0f0..3e4c94ce40 100644
--- a/src/mbgl/storage/default_file_source.cpp
+++ b/src/mbgl/storage/default_file_source.cpp
@@ -127,7 +127,6 @@ void DefaultFileSource::Impl::update(DefaultFileRequest* request) {
if (!request->response->stale && request->response->isExpired()) {
// Create a new Response object with `stale = true`, but the same data, and
// replace the current request object we have.
- // TODO: Make content shared_ptrs so we won't make copies of the content.
auto response = std::make_shared<Response>(*request->response);
response->stale = true;
request->response = response;
diff --git a/src/mbgl/text/glyph_pbf.cpp b/src/mbgl/text/glyph_pbf.cpp
index f351e66c2a..66008adb96 100644
--- a/src/mbgl/text/glyph_pbf.cpp
+++ b/src/mbgl/text/glyph_pbf.cpp
@@ -98,14 +98,15 @@ GlyphPBF::GlyphPBF(GlyphStore* store,
GlyphPBF::~GlyphPBF() = default;
void GlyphPBF::parse(GlyphStore* store, const std::string& fontStack, const std::string& url) {
- if (data.empty()) {
+ assert(data);
+ if (data->empty()) {
// If there is no data, this means we either haven't
// received any data.
return;
}
try {
- parseGlyphPBF(**store->getFontStack(fontStack), std::move(data));
+ parseGlyphPBF(**store->getFontStack(fontStack), *data);
} catch (const std::exception& ex) {
std::stringstream message;
message << "Failed to parse [" << url << "]: " << ex.what();
diff --git a/src/mbgl/text/glyph_pbf.hpp b/src/mbgl/text/glyph_pbf.hpp
index 205824bfe5..bf8567dbec 100644
--- a/src/mbgl/text/glyph_pbf.hpp
+++ b/src/mbgl/text/glyph_pbf.hpp
@@ -42,7 +42,7 @@ private:
void parse(GlyphStore* store, const std::string& fontStack, const std::string& url);
- std::string data;
+ std::shared_ptr<const std::string> data;
std::atomic<bool> parsed;
RequestHolder req;
diff --git a/src/mbgl/util/worker.cpp b/src/mbgl/util/worker.cpp
index 71c930b4ef..fc599713b3 100644
--- a/src/mbgl/util/worker.cpp
+++ b/src/mbgl/util/worker.cpp
@@ -16,8 +16,8 @@ class Worker::Impl {
public:
Impl() = default;
- void parseRasterTile(RasterBucket* bucket, std::string data, std::function<void (TileParseResult)> callback) {
- std::unique_ptr<util::Image> image(new util::Image(data));
+ void parseRasterTile(RasterBucket* bucket, const std::shared_ptr<const std::string> data, std::function<void (TileParseResult)> callback) {
+ std::unique_ptr<util::Image> image(new util::Image(*data));
if (!(*image)) {
callback(TileParseResult("error parsing raster image"));
}
@@ -29,9 +29,9 @@ public:
callback(TileParseResult(TileData::State::parsed));
}
- void parseVectorTile(TileWorker* worker, std::string data, std::function<void (TileParseResult)> callback) {
+ void parseVectorTile(TileWorker* worker, const std::shared_ptr<const std::string> data, std::function<void (TileParseResult)> callback) {
try {
- pbf tilePBF(reinterpret_cast<const unsigned char *>(data.data()), data.size());
+ pbf tilePBF(reinterpret_cast<const unsigned char*>(data->data()), data->size());
callback(worker->parse(VectorTile(tilePBF)));
} catch (const std::exception& ex) {
callback(TileParseResult(ex.what()));
@@ -61,12 +61,12 @@ Worker::Worker(std::size_t count) {
Worker::~Worker() = default;
-std::unique_ptr<WorkRequest> Worker::parseRasterTile(RasterBucket& bucket, std::string data, std::function<void (TileParseResult)> callback) {
+std::unique_ptr<WorkRequest> Worker::parseRasterTile(RasterBucket& bucket, const std::shared_ptr<const std::string> data, std::function<void (TileParseResult)> callback) {
current = (current + 1) % threads.size();
return threads[current]->invokeWithCallback(&Worker::Impl::parseRasterTile, callback, &bucket, data);
}
-std::unique_ptr<WorkRequest> Worker::parseVectorTile(TileWorker& worker, std::string data, std::function<void (TileParseResult)> callback) {
+std::unique_ptr<WorkRequest> Worker::parseVectorTile(TileWorker& worker, const std::shared_ptr<const std::string> data, std::function<void (TileParseResult)> callback) {
current = (current + 1) % threads.size();
return threads[current]->invokeWithCallback(&Worker::Impl::parseVectorTile, callback, &worker, data);
}
diff --git a/src/mbgl/util/worker.hpp b/src/mbgl/util/worker.hpp
index 4e63b45abf..18b1bc92b1 100644
--- a/src/mbgl/util/worker.hpp
+++ b/src/mbgl/util/worker.hpp
@@ -33,12 +33,12 @@ public:
Request parseRasterTile(
RasterBucket&,
- std::string data,
+ std::shared_ptr<const std::string> data,
std::function<void (TileParseResult)> callback);
Request parseVectorTile(
TileWorker&,
- std::string data,
+ std::shared_ptr<const std::string> data,
std::function<void (TileParseResult)> callback);
Request parseLiveTile(