diff options
author | Konstantin Käfer <mail@kkaefer.com> | 2015-10-16 16:14:55 +0200 |
---|---|---|
committer | Konstantin Käfer <mail@kkaefer.com> | 2015-10-26 15:54:27 +0100 |
commit | 5173bf1bb8d21054b0dd6251d23eb37323d6c525 (patch) | |
tree | d13536c22b8279e9fd7e8f4892596c42973170f3 /src | |
parent | 4e3503ea6cf30c55a2cc86f78c4a607bd14f1c41 (diff) | |
download | qtlocation-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.cpp | 2 | ||||
-rw-r--r-- | src/mbgl/map/source.cpp | 2 | ||||
-rw-r--r-- | src/mbgl/map/sprite.cpp | 20 | ||||
-rw-r--r-- | src/mbgl/map/sprite.hpp | 5 | ||||
-rw-r--r-- | src/mbgl/map/vector_tile_data.hpp | 2 | ||||
-rw-r--r-- | src/mbgl/storage/default_file_source.cpp | 1 | ||||
-rw-r--r-- | src/mbgl/text/glyph_pbf.cpp | 5 | ||||
-rw-r--r-- | src/mbgl/text/glyph_pbf.hpp | 2 | ||||
-rw-r--r-- | src/mbgl/util/worker.cpp | 12 | ||||
-rw-r--r-- | src/mbgl/util/worker.hpp | 4 |
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( |