diff options
author | John Firebaugh <john.firebaugh@gmail.com> | 2016-09-06 15:01:34 -0700 |
---|---|---|
committer | John Firebaugh <john.firebaugh@gmail.com> | 2016-09-16 12:01:06 -0700 |
commit | 41bbd4e4f7d66465433e370ca024ab0239fcace3 (patch) | |
tree | 8fe15fa31d97aafeb175a808e431b437297af88b /src/mbgl/tile/raster_tile.cpp | |
parent | 0bd66d40ddf9e75f860fe18e7c80de9c840f48ac (diff) | |
download | qtlocation-mapboxgl-41bbd4e4f7d66465433e370ca024ab0239fcace3.tar.gz |
[core] Use an actor model for tile worker concurrency
Diffstat (limited to 'src/mbgl/tile/raster_tile.cpp')
-rw-r--r-- | src/mbgl/tile/raster_tile.cpp | 49 |
1 files changed, 18 insertions, 31 deletions
diff --git a/src/mbgl/tile/raster_tile.cpp b/src/mbgl/tile/raster_tile.cpp index 9230c3d79d..303212da80 100644 --- a/src/mbgl/tile/raster_tile.cpp +++ b/src/mbgl/tile/raster_tile.cpp @@ -1,4 +1,5 @@ #include <mbgl/tile/raster_tile.hpp> +#include <mbgl/tile/raster_tile_worker.hpp> #include <mbgl/tile/tile_observer.hpp> #include <mbgl/tile/tile_loader_impl.hpp> #include <mbgl/style/source.hpp> @@ -6,8 +7,8 @@ #include <mbgl/storage/resource.hpp> #include <mbgl/storage/response.hpp> #include <mbgl/storage/file_source.hpp> -#include <mbgl/util/worker.hpp> -#include <mbgl/util/work_request.hpp> +#include <mbgl/renderer/raster_bucket.hpp> +#include <mbgl/util/run_loop.hpp> namespace mbgl { @@ -15,13 +16,20 @@ RasterTile::RasterTile(const OverscaledTileID& id_, const style::UpdateParameters& parameters, const Tileset& tileset) : Tile(id_), - worker(parameters.worker), - loader(*this, id_, parameters, tileset) { + loader(*this, id_, parameters, tileset), + mailbox(std::make_shared<Mailbox>(*util::RunLoop::Get())), + worker(parameters.workerScheduler, + ActorRef<RasterTile>(*this, mailbox)) { } RasterTile::~RasterTile() = default; +void RasterTile::cancel() { +} + void RasterTile::setError(std::exception_ptr err) { + bucket.reset(); + availableData = DataAvailability::All; observer->onTileError(*this, err); } @@ -30,30 +38,13 @@ void RasterTile::setData(std::shared_ptr<const std::string> data, optional<Timestamp> expires_) { modified = modified_; expires = expires_; + worker.invoke(&RasterTileWorker::parse, data); +} - if (!data) { - // This is a 404 response. We're treating these as empty tiles. - workRequest.reset(); - availableData = DataAvailability::All; - bucket.reset(); - observer->onTileLoaded(*this, TileLoadState::First); - return; - } - - workRequest.reset(); - workRequest = worker.parseRasterTile(std::make_unique<RasterBucket>(), data, [this] (RasterTileParseResult result) { - workRequest.reset(); - - availableData = DataAvailability::All; - - if (result.is<std::unique_ptr<Bucket>>()) { - bucket = std::move(result.get<std::unique_ptr<Bucket>>()); - observer->onTileLoaded(*this, TileLoadState::First); - } else { - bucket.reset(); - observer->onTileError(*this, result.get<std::exception_ptr>()); - } - }); +void RasterTile::onParsed(std::unique_ptr<Bucket> result) { + bucket = std::move(result); + availableData = DataAvailability::All; + observer->onTileChanged(*this); } Bucket* RasterTile::getBucket(const style::Layer&) { @@ -64,8 +55,4 @@ void RasterTile::setNecessity(Necessity necessity) { loader.setNecessity(necessity); } -void RasterTile::cancel() { - workRequest.reset(); -} - } // namespace mbgl |