summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorThiago Marcos P. Santos <tmpsantos@gmail.com>2019-02-14 16:56:17 +0200
committerThiago Marcos P. Santos <tmpsantos@gmail.com>2019-05-10 14:20:38 +0300
commit06f1dc48a2fb317979ab48ce323115be5bd48f16 (patch)
tree5ef1e78a1f98a7a26034ca519e267bda235b2817 /src
parent947bc75f56fae7f1e70f21b98730dc6b460b9194 (diff)
downloadqtlocation-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.json2
-rw-r--r--src/mbgl/actor/scheduler.cpp20
-rw-r--r--src/mbgl/map/map.cpp4
-rw-r--r--src/mbgl/map/map_impl.cpp4
-rw-r--r--src/mbgl/map/map_impl.hpp5
-rw-r--r--src/mbgl/renderer/renderer.cpp2
-rw-r--r--src/mbgl/renderer/renderer_impl.cpp3
-rw-r--r--src/mbgl/renderer/renderer_impl.hpp3
-rw-r--r--src/mbgl/renderer/tile_parameters.hpp2
-rw-r--r--src/mbgl/sprite/sprite_loader.cpp8
-rw-r--r--src/mbgl/sprite/sprite_loader.hpp3
-rw-r--r--src/mbgl/style/sources/custom_geometry_source.cpp4
-rw-r--r--src/mbgl/style/style.cpp4
-rw-r--r--src/mbgl/style/style_impl.cpp7
-rw-r--r--src/mbgl/style/style_impl.hpp4
-rw-r--r--src/mbgl/tile/geometry_tile.cpp3
-rw-r--r--src/mbgl/tile/raster_dem_tile.cpp3
-rw-r--r--src/mbgl/tile/raster_tile.cpp3
-rw-r--r--src/mbgl/util/thread_pool.cpp58
-rw-r--r--src/mbgl/util/thread_pool.hpp28
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