diff options
author | Thiago Marcos P. Santos <tmpsantos@gmail.com> | 2019-02-14 16:56:17 +0200 |
---|---|---|
committer | Thiago Marcos P. Santos <tmpsantos@gmail.com> | 2019-05-10 14:20:38 +0300 |
commit | 06f1dc48a2fb317979ab48ce323115be5bd48f16 (patch) | |
tree | 5ef1e78a1f98a7a26034ca519e267bda235b2817 /src | |
parent | 947bc75f56fae7f1e70f21b98730dc6b460b9194 (diff) | |
download | qtlocation-mapboxgl-06f1dc48a2fb317979ab48ce323115be5bd48f16.tar.gz |
[core] Make the BackgroundScheduler a singleton
- Do not carry it over everywhere as parameter, it is a shared
instance anyway and the lifecycle is pretty much the app lifecycle
from the moment we instantiate a map.
- Rename to BackgroundScheduler because it is a Scheduler that will
do tasks in the background, we don't make assumptions if it is a
thread pool or a single thread.
- Most importantly, remove the dependency from `core` on `platform`.
Diffstat (limited to 'src')
-rw-r--r-- | src/core-files.json | 2 | ||||
-rw-r--r-- | src/mbgl/actor/scheduler.cpp | 20 | ||||
-rw-r--r-- | src/mbgl/map/map.cpp | 4 | ||||
-rw-r--r-- | src/mbgl/map/map_impl.cpp | 4 | ||||
-rw-r--r-- | src/mbgl/map/map_impl.hpp | 5 | ||||
-rw-r--r-- | src/mbgl/renderer/renderer.cpp | 2 | ||||
-rw-r--r-- | src/mbgl/renderer/renderer_impl.cpp | 3 | ||||
-rw-r--r-- | src/mbgl/renderer/renderer_impl.hpp | 3 | ||||
-rw-r--r-- | src/mbgl/renderer/tile_parameters.hpp | 2 | ||||
-rw-r--r-- | src/mbgl/sprite/sprite_loader.cpp | 8 | ||||
-rw-r--r-- | src/mbgl/sprite/sprite_loader.hpp | 3 | ||||
-rw-r--r-- | src/mbgl/style/sources/custom_geometry_source.cpp | 4 | ||||
-rw-r--r-- | src/mbgl/style/style.cpp | 4 | ||||
-rw-r--r-- | src/mbgl/style/style_impl.cpp | 7 | ||||
-rw-r--r-- | src/mbgl/style/style_impl.hpp | 4 | ||||
-rw-r--r-- | src/mbgl/tile/geometry_tile.cpp | 3 | ||||
-rw-r--r-- | src/mbgl/tile/raster_dem_tile.cpp | 3 | ||||
-rw-r--r-- | src/mbgl/tile/raster_tile.cpp | 3 | ||||
-rw-r--r-- | src/mbgl/util/thread_pool.cpp | 58 | ||||
-rw-r--r-- | src/mbgl/util/thread_pool.hpp | 28 |
20 files changed, 128 insertions, 42 deletions
diff --git a/src/core-files.json b/src/core-files.json index c0412dd3a8..d721935268 100644 --- a/src/core-files.json +++ b/src/core-files.json @@ -302,6 +302,7 @@ "src/mbgl/util/rapidjson.cpp", "src/mbgl/util/stopwatch.cpp", "src/mbgl/util/string.cpp", + "src/mbgl/util/thread_pool.cpp", "src/mbgl/util/tile_cover.cpp", "src/mbgl/util/tile_cover_impl.cpp", "src/mbgl/util/tiny_sdf.cpp", @@ -762,6 +763,7 @@ "mbgl/util/std.hpp": "src/mbgl/util/std.hpp", "mbgl/util/stopwatch.hpp": "src/mbgl/util/stopwatch.hpp", "mbgl/util/thread_local.hpp": "src/mbgl/util/thread_local.hpp", + "mbgl/util/thread_pool.hpp": "src/mbgl/util/thread_pool.hpp", "mbgl/util/tile_coordinate.hpp": "src/mbgl/util/tile_coordinate.hpp", "mbgl/util/tile_cover.hpp": "src/mbgl/util/tile_cover.hpp", "mbgl/util/tile_cover_impl.hpp": "src/mbgl/util/tile_cover_impl.hpp", diff --git a/src/mbgl/actor/scheduler.cpp b/src/mbgl/actor/scheduler.cpp index d7cdb2737b..cb0c7728ec 100644 --- a/src/mbgl/actor/scheduler.cpp +++ b/src/mbgl/actor/scheduler.cpp @@ -1,8 +1,11 @@ #include <mbgl/actor/scheduler.hpp> #include <mbgl/util/thread_local.hpp> +#include <mbgl/util/thread_pool.hpp> namespace mbgl { - + +util::ThreadLocal<Scheduler> g_currentScheduler; + static auto& current() { static util::ThreadLocal<Scheduler> scheduler; return scheduler; @@ -16,4 +19,19 @@ Scheduler* Scheduler::GetCurrent() { return current().get(); } +// static +std::shared_ptr<Scheduler> Scheduler::GetBackground() { + static std::weak_ptr<Scheduler> weak; + static std::mutex mtx; + + std::lock_guard<std::mutex> lock(mtx); + std::shared_ptr<Scheduler> scheduler = weak.lock(); + + if (!scheduler) { + weak = scheduler = std::make_shared<ThreadPool>(4); + } + + return scheduler; +} + } //namespace mbgl diff --git a/src/mbgl/map/map.cpp b/src/mbgl/map/map.cpp index c31bb8ca34..c35f33305c 100644 --- a/src/mbgl/map/map.cpp +++ b/src/mbgl/map/map.cpp @@ -17,7 +17,6 @@ #include <mbgl/util/exception.hpp> #include <mbgl/util/mapbox.hpp> #include <mbgl/util/tile_coordinate.hpp> -#include <mbgl/actor/scheduler.hpp> #include <mbgl/util/logging.hpp> #include <mbgl/math/log2.hpp> @@ -29,10 +28,9 @@ using namespace style; Map::Map(RendererFrontend& frontend, MapObserver& observer, - Scheduler& scheduler, const MapOptions& mapOptions, const ResourceOptions& resourceOptions) - : impl(std::make_unique<Impl>(frontend, observer, scheduler, + : impl(std::make_unique<Impl>(frontend, observer, FileSource::getSharedFileSource(resourceOptions), mapOptions)) {} diff --git a/src/mbgl/map/map_impl.cpp b/src/mbgl/map/map_impl.cpp index 1ec7255822..fa15461ff2 100644 --- a/src/mbgl/map/map_impl.cpp +++ b/src/mbgl/map/map_impl.cpp @@ -9,18 +9,16 @@ namespace mbgl { Map::Impl::Impl(RendererFrontend& frontend_, MapObserver& observer_, - Scheduler& scheduler_, std::shared_ptr<FileSource> fileSource_, const MapOptions& mapOptions) : observer(observer_), rendererFrontend(frontend_), - scheduler(scheduler_), transform(observer, mapOptions.constrainMode(), mapOptions.viewportMode()), mode(mapOptions.mapMode()), pixelRatio(mapOptions.pixelRatio()), crossSourceCollisions(mapOptions.crossSourceCollisions()), fileSource(std::move(fileSource_)), - style(std::make_unique<style::Style>(scheduler, *fileSource, pixelRatio)), + style(std::make_unique<style::Style>(*fileSource, pixelRatio)), annotationManager(*style) { transform.setNorthOrientation(mapOptions.northOrientation()); style->impl->setObserver(this); diff --git a/src/mbgl/map/map_impl.hpp b/src/mbgl/map/map_impl.hpp index f233f78275..84b43c8343 100644 --- a/src/mbgl/map/map_impl.hpp +++ b/src/mbgl/map/map_impl.hpp @@ -1,7 +1,5 @@ #pragma once -#include <mbgl/actor/actor.hpp> -#include <mbgl/actor/scheduler.hpp> #include <mbgl/annotation/annotation_manager.hpp> #include <mbgl/map/map.hpp> #include <mbgl/map/map_observer.hpp> @@ -30,7 +28,7 @@ struct StillImageRequest { class Map::Impl : public style::Observer, public RendererObserver { public: - Impl(RendererFrontend&, MapObserver&, Scheduler&, std::shared_ptr<FileSource>, const MapOptions&); + Impl(RendererFrontend&, MapObserver&, std::shared_ptr<FileSource>, const MapOptions&); ~Impl() final; // StyleObserver @@ -54,7 +52,6 @@ public: MapObserver& observer; RendererFrontend& rendererFrontend; - Scheduler& scheduler; Transform transform; diff --git a/src/mbgl/renderer/renderer.cpp b/src/mbgl/renderer/renderer.cpp index 18cb0ebc07..ba213c435d 100644 --- a/src/mbgl/renderer/renderer.cpp +++ b/src/mbgl/renderer/renderer.cpp @@ -9,12 +9,10 @@ namespace mbgl { Renderer::Renderer(gfx::RendererBackend& backend, float pixelRatio_, - Scheduler& scheduler_, const optional<std::string> programCacheDir_, const optional<std::string> localFontFamily_) : impl(std::make_unique<Impl>(backend, pixelRatio_, - scheduler_, std::move(programCacheDir_), std::move(localFontFamily_))) { } diff --git a/src/mbgl/renderer/renderer_impl.cpp b/src/mbgl/renderer/renderer_impl.cpp index c756234e8d..3db9439b5c 100644 --- a/src/mbgl/renderer/renderer_impl.cpp +++ b/src/mbgl/renderer/renderer_impl.cpp @@ -40,11 +40,9 @@ static RendererObserver& nullObserver() { Renderer::Impl::Impl(gfx::RendererBackend& backend_, float pixelRatio_, - Scheduler& scheduler_, const optional<std::string> programCacheDir_, const optional<std::string> localFontFamily_) : backend(backend_) - , scheduler(scheduler_) , observer(&nullObserver()) , pixelRatio(pixelRatio_) , programCacheDir(std::move(programCacheDir_)) @@ -114,7 +112,6 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) { updateParameters.pixelRatio, updateParameters.debugOptions, updateParameters.transformState, - scheduler, updateParameters.fileSource, updateParameters.mode, updateParameters.annotationManager, diff --git a/src/mbgl/renderer/renderer_impl.hpp b/src/mbgl/renderer/renderer_impl.hpp index f0d4720ce2..270ea4d517 100644 --- a/src/mbgl/renderer/renderer_impl.hpp +++ b/src/mbgl/renderer/renderer_impl.hpp @@ -26,7 +26,6 @@ class UpdateParameters; class RenderStaticData; class RenderedQueryOptions; class SourceQueryOptions; -class Scheduler; class GlyphManager; class ImageManager; class LineAtlas; @@ -42,7 +41,6 @@ class Renderer::Impl : public GlyphManagerObserver, public: Impl(gfx::RendererBackend&, float pixelRatio_, - Scheduler&, const optional<std::string> programCacheDir, const optional<std::string> localFontFamily_); ~Impl() final; @@ -99,7 +97,6 @@ private: friend class Renderer; gfx::RendererBackend& backend; - Scheduler& scheduler; RendererObserver* observer; diff --git a/src/mbgl/renderer/tile_parameters.hpp b/src/mbgl/renderer/tile_parameters.hpp index 665c7490d2..cbe8dfb3ba 100644 --- a/src/mbgl/renderer/tile_parameters.hpp +++ b/src/mbgl/renderer/tile_parameters.hpp @@ -5,7 +5,6 @@ namespace mbgl { class TransformState; -class Scheduler; class FileSource; class AnnotationManager; class ImageManager; @@ -16,7 +15,6 @@ public: const float pixelRatio; const MapDebugOptions debugOptions; const TransformState& transformState; - Scheduler& workerScheduler; FileSource& fileSource; const MapMode mode; AnnotationManager& annotationManager; diff --git a/src/mbgl/sprite/sprite_loader.cpp b/src/mbgl/sprite/sprite_loader.cpp index ce8fbe5894..bfb0c570d6 100644 --- a/src/mbgl/sprite/sprite_loader.cpp +++ b/src/mbgl/sprite/sprite_loader.cpp @@ -20,9 +20,9 @@ namespace mbgl { static SpriteLoaderObserver nullObserver; struct SpriteLoader::Loader { - Loader(Scheduler& scheduler, SpriteLoader& imageManager) + Loader(SpriteLoader& imageManager) : mailbox(std::make_shared<Mailbox>(*Scheduler::GetCurrent())), - worker(scheduler, ActorRef<SpriteLoader>(imageManager, mailbox)) { + worker(Scheduler::GetBackground(), ActorRef<SpriteLoader>(imageManager, mailbox)) { } std::shared_ptr<const std::string> image; @@ -40,14 +40,14 @@ SpriteLoader::SpriteLoader(float pixelRatio_) SpriteLoader::~SpriteLoader() = default; -void SpriteLoader::load(const std::string& url, Scheduler& scheduler, FileSource& fileSource) { +void SpriteLoader::load(const std::string& url, FileSource& fileSource) { if (url.empty()) { // Treat a non-existent sprite as a successfully loaded empty sprite. observer->onSpriteLoaded({}); return; } - loader = std::make_unique<Loader>(scheduler, *this); + loader = std::make_unique<Loader>(*this); loader->jsonRequest = fileSource.request(Resource::spriteJSON(url, pixelRatio), [this](Response res) { if (res.error) { diff --git a/src/mbgl/sprite/sprite_loader.hpp b/src/mbgl/sprite/sprite_loader.hpp index 0daf46be9c..0b7d37fa14 100644 --- a/src/mbgl/sprite/sprite_loader.hpp +++ b/src/mbgl/sprite/sprite_loader.hpp @@ -12,7 +12,6 @@ namespace mbgl { -class Scheduler; class FileSource; class SpriteLoaderObserver; @@ -21,7 +20,7 @@ public: SpriteLoader(float pixelRatio); ~SpriteLoader(); - void load(const std::string& url, Scheduler&, FileSource&); + void load(const std::string& url, FileSource&); void setObserver(SpriteLoaderObserver*); diff --git a/src/mbgl/style/sources/custom_geometry_source.cpp b/src/mbgl/style/sources/custom_geometry_source.cpp index 7420be9320..6e9d8d65fb 100644 --- a/src/mbgl/style/sources/custom_geometry_source.cpp +++ b/src/mbgl/style/sources/custom_geometry_source.cpp @@ -4,7 +4,6 @@ #include <mbgl/actor/actor.hpp> #include <mbgl/actor/scheduler.hpp> #include <mbgl/tile/tile_id.hpp> -#include <mbgl/util/shared_thread_pool.hpp> #include <tuple> #include <map> @@ -14,8 +13,7 @@ namespace style { CustomGeometrySource::CustomGeometrySource(std::string id, const CustomGeometrySource::Options options) : Source(makeMutable<CustomGeometrySource::Impl>(std::move(id), options)), - threadPool(sharedThreadPool()), - loader(std::make_unique<Actor<CustomTileLoader>>(*threadPool, options.fetchTileFunction, options.cancelTileFunction)) { + loader(std::make_unique<Actor<CustomTileLoader>>(Scheduler::GetBackground(), options.fetchTileFunction, options.cancelTileFunction)) { } CustomGeometrySource::~CustomGeometrySource() = default; diff --git a/src/mbgl/style/style.cpp b/src/mbgl/style/style.cpp index bd8631fc52..783c850097 100644 --- a/src/mbgl/style/style.cpp +++ b/src/mbgl/style/style.cpp @@ -8,8 +8,8 @@ namespace mbgl { namespace style { -Style::Style(Scheduler& scheduler, FileSource& fileSource, float pixelRatio) - : impl(std::make_unique<Impl>(scheduler, fileSource, pixelRatio)) { +Style::Style(FileSource& fileSource, float pixelRatio) + : impl(std::make_unique<Impl>(fileSource, pixelRatio)) { } Style::~Style() = default; diff --git a/src/mbgl/style/style_impl.cpp b/src/mbgl/style/style_impl.cpp index d527b8440b..10fee73cdd 100644 --- a/src/mbgl/style/style_impl.cpp +++ b/src/mbgl/style/style_impl.cpp @@ -27,9 +27,8 @@ namespace style { static Observer nullObserver; -Style::Impl::Impl(Scheduler& scheduler_, FileSource& fileSource_, float pixelRatio) - : scheduler(scheduler_), - fileSource(fileSource_), +Style::Impl::Impl(FileSource& fileSource_, float pixelRatio) + : fileSource(fileSource_), spriteLoader(std::make_unique<SpriteLoader>(pixelRatio)), light(std::make_unique<Light>()), observer(&nullObserver) { @@ -111,7 +110,7 @@ void Style::Impl::parse(const std::string& json_) { setLight(std::make_unique<Light>(parser.light)); spriteLoaded = false; - spriteLoader->load(parser.spriteURL, scheduler, fileSource); + spriteLoader->load(parser.spriteURL, fileSource); glyphURL = parser.glyphURL; loaded = true; diff --git a/src/mbgl/style/style_impl.hpp b/src/mbgl/style/style_impl.hpp index 3dc222bfad..4c56f6785b 100644 --- a/src/mbgl/style/style_impl.hpp +++ b/src/mbgl/style/style_impl.hpp @@ -25,7 +25,6 @@ namespace mbgl { -class Scheduler; class FileSource; class AsyncRequest; class SpriteLoader; @@ -38,7 +37,7 @@ class Style::Impl : public SpriteLoaderObserver, public LightObserver, public util::noncopyable { public: - Impl(Scheduler&, FileSource&, float pixelRatio); + Impl(FileSource&, float pixelRatio); ~Impl() override; void loadJSON(const std::string&); @@ -98,7 +97,6 @@ public: private: void parse(const std::string&); - Scheduler& scheduler; FileSource& fileSource; std::string url; diff --git a/src/mbgl/tile/geometry_tile.cpp b/src/mbgl/tile/geometry_tile.cpp index 029c761e53..d110b2f826 100644 --- a/src/mbgl/tile/geometry_tile.cpp +++ b/src/mbgl/tile/geometry_tile.cpp @@ -1,4 +1,5 @@ #include <mbgl/tile/geometry_tile.hpp> + #include <mbgl/tile/geometry_tile_worker.hpp> #include <mbgl/tile/geometry_tile_data.hpp> #include <mbgl/tile/tile_observer.hpp> @@ -45,7 +46,7 @@ GeometryTile::GeometryTile(const OverscaledTileID& id_, ImageRequestor(parameters.imageManager), sourceID(std::move(sourceID_)), mailbox(std::make_shared<Mailbox>(*Scheduler::GetCurrent())), - worker(parameters.workerScheduler, + worker(Scheduler::GetBackground(), ActorRef<GeometryTile>(*this, mailbox), id_, sourceID, diff --git a/src/mbgl/tile/raster_dem_tile.cpp b/src/mbgl/tile/raster_dem_tile.cpp index 224c5c9062..8b4e0113c7 100644 --- a/src/mbgl/tile/raster_dem_tile.cpp +++ b/src/mbgl/tile/raster_dem_tile.cpp @@ -1,4 +1,5 @@ #include <mbgl/tile/raster_dem_tile.hpp> + #include <mbgl/tile/raster_dem_tile_worker.hpp> #include <mbgl/tile/tile_observer.hpp> #include <mbgl/tile/tile_loader_impl.hpp> @@ -17,7 +18,7 @@ RasterDEMTile::RasterDEMTile(const OverscaledTileID& id_, : Tile(Kind::RasterDEM, id_), loader(*this, id_, parameters, tileset), mailbox(std::make_shared<Mailbox>(*Scheduler::GetCurrent())), - worker(parameters.workerScheduler, + worker(Scheduler::GetBackground(), ActorRef<RasterDEMTile>(*this, mailbox)) { encoding = tileset.encoding; diff --git a/src/mbgl/tile/raster_tile.cpp b/src/mbgl/tile/raster_tile.cpp index ff02301021..9da11b3595 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> @@ -17,7 +18,7 @@ RasterTile::RasterTile(const OverscaledTileID& id_, : Tile(Kind::Raster, id_), loader(*this, id_, parameters, tileset), mailbox(std::make_shared<Mailbox>(*Scheduler::GetCurrent())), - worker(parameters.workerScheduler, + worker(Scheduler::GetBackground(), ActorRef<RasterTile>(*this, mailbox)) { } diff --git a/src/mbgl/util/thread_pool.cpp b/src/mbgl/util/thread_pool.cpp new file mode 100644 index 0000000000..79c2f75012 --- /dev/null +++ b/src/mbgl/util/thread_pool.cpp @@ -0,0 +1,58 @@ +#include <mbgl/util/thread_pool.hpp> + +#include <mbgl/util/platform.hpp> +#include <mbgl/util/string.hpp> + +namespace mbgl { + +ThreadPool::ThreadPool(std::size_t count) { + threads.reserve(count); + + for (std::size_t i = 0; i < count; ++i) { + threads.emplace_back([this, i]() { + platform::setCurrentThreadName(std::string{ "Worker " } + util::toString(i + 1)); + + while (true) { + std::unique_lock<std::mutex> lock(mutex); + + cv.wait(lock, [this] { + return !queue.empty() || terminate; + }); + + if (terminate) { + return; + } + + auto mailbox = queue.front(); + queue.pop(); + lock.unlock(); + + Mailbox::maybeReceive(mailbox); + } + }); + } +} + +ThreadPool::~ThreadPool() { + { + std::lock_guard<std::mutex> lock(mutex); + terminate = true; + } + + cv.notify_all(); + + for (auto& thread : threads) { + thread.join(); + } +} + +void ThreadPool::schedule(std::weak_ptr<Mailbox> mailbox) { + { + std::lock_guard<std::mutex> lock(mutex); + queue.push(mailbox); + } + + cv.notify_one(); +} + +} // namespace mbgl diff --git a/src/mbgl/util/thread_pool.hpp b/src/mbgl/util/thread_pool.hpp new file mode 100644 index 0000000000..509fd06061 --- /dev/null +++ b/src/mbgl/util/thread_pool.hpp @@ -0,0 +1,28 @@ +#pragma once + +#include <mbgl/actor/mailbox.hpp> +#include <mbgl/actor/scheduler.hpp> + +#include <condition_variable> +#include <mutex> +#include <queue> +#include <thread> + +namespace mbgl { + +class ThreadPool final : public Scheduler { +public: + explicit ThreadPool(std::size_t count); + ~ThreadPool() override; + + void schedule(std::weak_ptr<Mailbox>) override; + +private: + std::vector<std::thread> threads; + std::queue<std::weak_ptr<Mailbox>> queue; + std::mutex mutex; + std::condition_variable cv; + bool terminate{ false }; +}; + +} // namespace mbgl |