From a2592f1e7ee498c39ee7ac96052c26595dee651f Mon Sep 17 00:00:00 2001 From: mwilsnd Date: Tue, 4 Jun 2024 14:29:19 -0400 Subject: [PATCH] More changes, render thread task management --- include/mbgl/actor/actor.hpp | 14 +++++--------- include/mbgl/actor/established_actor.hpp | 18 +++++++++++++++++- include/mbgl/actor/mailbox.hpp | 6 +++++- include/mbgl/actor/scheduler.hpp | 3 ++- include/mbgl/gfx/context.hpp | 5 +---- include/mbgl/gfx/renderer_backend.hpp | 8 ++++++-- include/mbgl/gl/renderer_backend.hpp | 2 +- include/mbgl/mtl/context.hpp | 3 +-- src/mbgl/actor/mailbox.cpp | 16 +++++++++++++--- src/mbgl/gfx/renderer_backend.cpp | 4 ++-- src/mbgl/gl/context.cpp | 9 ++++----- src/mbgl/gl/context.hpp | 3 +-- src/mbgl/gl/renderer_backend.cpp | 7 +++---- src/mbgl/mtl/context.cpp | 9 ++++----- src/mbgl/renderer/render_orchestrator.cpp | 7 ++++--- src/mbgl/renderer/render_orchestrator.hpp | 3 ++- src/mbgl/renderer/renderer_impl.cpp | 2 +- src/mbgl/renderer/tile_parameters.hpp | 2 ++ src/mbgl/tile/geometry_tile.cpp | 8 ++++---- src/mbgl/tile/geometry_tile.hpp | 2 +- src/mbgl/tile/geometry_tile_worker.cpp | 2 +- src/mbgl/tile/geometry_tile_worker.hpp | 2 +- src/mbgl/util/thread_pool.cpp | 3 --- src/mbgl/util/thread_pool.hpp | 3 ++- test/util/async_task.test.cpp | 8 ++++---- 25 files changed, 87 insertions(+), 62 deletions(-) diff --git a/include/mbgl/actor/actor.hpp b/include/mbgl/actor/actor.hpp index 2a02d966ded..f5a4bfa10d4 100644 --- a/include/mbgl/actor/actor.hpp +++ b/include/mbgl/actor/actor.hpp @@ -62,26 +62,22 @@ class Actor { template Actor(Scheduler& scheduler, Args&&... args) : target(scheduler, parent, std::forward(args)...) {} + + template + Actor(const TaggedScheduler& scheduler, Args&&... args) + : retainer(scheduler.get()), + target(scheduler, parent, std::forward(args)...) {} template Actor(std::shared_ptr scheduler, Args&&... args) : retainer(std::move(scheduler)), target(*retainer, parent, std::forward(args)...) {} - template - Actor(TaggedScheduler& scheduler, Args&&... args) - : schedulerTag(scheduler.tag()), - retainer(scheduler.get()), - target(*retainer, parent, std::forward(args)...) {} - - - Actor(const Actor&) = delete; ActorRef> self() { return parent.self(); } private: - const void* schedulerTag = nullptr; const std::shared_ptr retainer; AspiringActor parent; EstablishedActor target; diff --git a/include/mbgl/actor/established_actor.hpp b/include/mbgl/actor/established_actor.hpp index 3a60033672f..5246e1c61b6 100644 --- a/include/mbgl/actor/established_actor.hpp +++ b/include/mbgl/actor/established_actor.hpp @@ -33,7 +33,18 @@ class EstablishedActor { class... Args, typename std::enable_if_t || std::is_constructible_v, Args...>>* = nullptr> - EstablishedActor(Scheduler& scheduler, AspiringActor& parent_, Args&&... args) + EstablishedActor(Scheduler& scheduler, AspiringActor& parent_, Args&&... args) + : parent(parent_) { + emplaceObject(std::forward(args)...); + parent.mailbox->open(scheduler); + } + + // Construct the Object from a parameter pack `args` (i.e. `Object(args...)`) + template || + std::is_constructible_v, Args...>>* = nullptr> + EstablishedActor(const TaggedScheduler& scheduler, AspiringActor& parent_, Args&&... args) : parent(parent_) { emplaceObject(std::forward(args)...); parent.mailbox->open(scheduler); @@ -48,6 +59,11 @@ class EstablishedActor { parent.mailbox->open(scheduler); } + template >::value> + EstablishedActor(const TaggedScheduler& scheduler, AspiringActor& parent_, ArgsTuple&& args) { + EstablishedActor(*scheduler.get(), parent_, std::forward(args)); + } + EstablishedActor(const EstablishedActor&) = delete; ~EstablishedActor() { diff --git a/include/mbgl/actor/mailbox.hpp b/include/mbgl/actor/mailbox.hpp index b558062aeb3..123fa019c6d 100644 --- a/include/mbgl/actor/mailbox.hpp +++ b/include/mbgl/actor/mailbox.hpp @@ -6,6 +6,7 @@ #include #include +#include namespace mbgl { @@ -21,11 +22,13 @@ class Mailbox : public std::enable_shared_from_this { Mailbox(); Mailbox(Scheduler&); + Mailbox(const TaggedScheduler&); /// Attach the given scheduler to this mailbox and begin processing messages /// sent to it. The mailbox must be a "holding" mailbox, as created by the /// default constructor Mailbox(). - void open(Scheduler& scheduler_); + void open(const TaggedScheduler& scheduler_); + void open(Scheduler&); void close(); // Indicate this mailbox will no longer be checked for messages @@ -46,6 +49,7 @@ class Mailbox : public std::enable_shared_from_this { Abandoned }; + const void* schedulerTag{nullptr}; mapbox::base::WeakPtr weakScheduler; std::recursive_mutex receivingMutex; diff --git a/include/mbgl/actor/scheduler.hpp b/include/mbgl/actor/scheduler.hpp index fb193b3fc40..badae746338 100644 --- a/include/mbgl/actor/scheduler.hpp +++ b/include/mbgl/actor/scheduler.hpp @@ -47,7 +47,7 @@ class Scheduler { virtual void runOnRenderThread(const void*, std::function&&) {} /// Run render thread jobs for the given tag address /// @param closeQueue Runs all render jobs and then removes the internal queue. - virtual void runRenderJobs(const void*, bool closeQueue = false) {} + virtual void runRenderJobs(const void*, [[maybe_unused]] bool closeQueue = false) {} /// Returns a closure wrapping the given one. /// /// When the returned closure is invoked for the first time, it schedules @@ -127,6 +127,7 @@ class TaggedScheduler { TaggedScheduler(std::shared_ptr scheduler_, const void* tagAddr_) : scheduler(std::move(scheduler_)), tagAddr(tagAddr_) {} + TaggedScheduler(const TaggedScheduler&) = default; /// @brief Get the wrapped scheduler /// @return diff --git a/include/mbgl/gfx/context.hpp b/include/mbgl/gfx/context.hpp index d2300a4d3c2..652deb3cbde 100644 --- a/include/mbgl/gfx/context.hpp +++ b/include/mbgl/gfx/context.hpp @@ -54,8 +54,7 @@ using VertexAttributeArrayPtr = std::shared_ptr; class Context { protected: Context(uint32_t maximumVertexBindingCount_) - : maximumVertexBindingCount(maximumVertexBindingCount_), - backgroundScheduler(Scheduler::GetBackground()) {} + : maximumVertexBindingCount(maximumVertexBindingCount_) {} public: static constexpr const uint32_t minimumRequiredVertexBindingCount = 8; @@ -174,8 +173,6 @@ class Context { virtual std::unique_ptr createDrawScopeResource() = 0; gfx::RenderingStats stats; - - std::shared_ptr backgroundScheduler; }; } // namespace gfx diff --git a/include/mbgl/gfx/renderer_backend.hpp b/include/mbgl/gfx/renderer_backend.hpp index b777e686a19..d4daae04d92 100644 --- a/include/mbgl/gfx/renderer_backend.hpp +++ b/include/mbgl/gfx/renderer_backend.hpp @@ -1,5 +1,6 @@ #pragma once +#include #include #include @@ -25,13 +26,16 @@ enum class ContextMode : bool { class RendererBackend { protected: - explicit RendererBackend(ContextMode, mbgl::Map*); + explicit RendererBackend(ContextMode); public: virtual ~RendererBackend(); RendererBackend(const RendererBackend&) = delete; RendererBackend& operator=(const RendererBackend&) = delete; + // Return the background thread pool assigned to this backend + TaggedScheduler& getThreadPool() noexcept { return threadPool; } + /// Returns the device's context. Context& getContext(); @@ -70,8 +74,8 @@ class RendererBackend { protected: std::unique_ptr context; const ContextMode contextMode; - const mbgl::Map* owner; std::once_flag initialized; + TaggedScheduler threadPool; friend class BackendScope; }; diff --git a/include/mbgl/gl/renderer_backend.hpp b/include/mbgl/gl/renderer_backend.hpp index a23ccfc103d..0d64a585be9 100644 --- a/include/mbgl/gl/renderer_backend.hpp +++ b/include/mbgl/gl/renderer_backend.hpp @@ -16,7 +16,7 @@ using FramebufferID = uint32_t; class RendererBackend : public gfx::RendererBackend { public: - RendererBackend(gfx::ContextMode, mbgl::Map*); + RendererBackend(gfx::ContextMode); ~RendererBackend() override; /// Called prior to rendering to update the internally assumed OpenGL state. diff --git a/include/mbgl/mtl/context.hpp b/include/mbgl/mtl/context.hpp index 8c75cab615a..ce95fc45f5e 100644 --- a/include/mbgl/mtl/context.hpp +++ b/include/mbgl/mtl/context.hpp @@ -44,7 +44,7 @@ using UniqueVertexBufferResource = std::unique_ptr; class Context final : public gfx::Context { public: - Context(RendererBackend&, TaggedScheduler); + Context(RendererBackend&); ~Context() noexcept override; Context(const Context&) = delete; Context& operator=(const Context& other) = delete; @@ -159,7 +159,6 @@ class Context final : public gfx::Context { private: RendererBackend& backend; - TaggedScheduler& scheduler; bool cleanupOnDestruction = true; std::optional emptyBuffer; diff --git a/src/mbgl/actor/mailbox.cpp b/src/mbgl/actor/mailbox.cpp index ad63f4bc5d3..85c236354db 100644 --- a/src/mbgl/actor/mailbox.cpp +++ b/src/mbgl/actor/mailbox.cpp @@ -12,6 +12,16 @@ Mailbox::Mailbox() = default; Mailbox::Mailbox(Scheduler& scheduler_) : weakScheduler(scheduler_.makeWeakPtr()) {} +Mailbox::Mailbox(const TaggedScheduler& scheduler_) + : schedulerTag(scheduler_.tag()), + weakScheduler(scheduler_.get()->makeWeakPtr()) {} + +void Mailbox::open(const TaggedScheduler& scheduler_) { + assert(!weakScheduler); + schedulerTag = scheduler_.tag(); + return open(*scheduler_.get()); +} + void Mailbox::open(Scheduler& scheduler_) { assert(!weakScheduler); @@ -28,7 +38,7 @@ void Mailbox::open(Scheduler& scheduler_) { if (!queue.empty()) { auto guard = weakScheduler.lock(); - if (weakScheduler) weakScheduler->schedule(makeClosure(shared_from_this())); + if (weakScheduler) weakScheduler->schedule(schedulerTag, makeClosure(shared_from_this())); } } @@ -86,7 +96,7 @@ void Mailbox::push(std::unique_ptr message) { queue.push(std::move(message)); auto guard = weakScheduler.lock(); if (wasEmpty && weakScheduler) { - weakScheduler->schedule(makeClosure(shared_from_this())); + weakScheduler->schedule(schedulerTag, makeClosure(shared_from_this())); } } @@ -127,7 +137,7 @@ void Mailbox::receive() { (*message)(); if (!wasEmpty) { - weakScheduler->schedule(makeClosure(shared_from_this())); + weakScheduler->schedule(schedulerTag, makeClosure(shared_from_this())); } } diff --git a/src/mbgl/gfx/renderer_backend.cpp b/src/mbgl/gfx/renderer_backend.cpp index 257b1ab3bad..15cb6c446b0 100644 --- a/src/mbgl/gfx/renderer_backend.cpp +++ b/src/mbgl/gfx/renderer_backend.cpp @@ -5,9 +5,9 @@ namespace mbgl { namespace gfx { -RendererBackend::RendererBackend(const ContextMode contextMode_, mbgl::Map* map) +RendererBackend::RendererBackend(const ContextMode contextMode_) : contextMode(contextMode_), - owner(map) {} + threadPool(Scheduler::GetBackground(), static_cast(this)) {} RendererBackend::~RendererBackend() = default; gfx::Context& RendererBackend::getContext() { diff --git a/src/mbgl/gl/context.cpp b/src/mbgl/gl/context.cpp index ef8f573d180..0ff2dc5caa4 100644 --- a/src/mbgl/gl/context.cpp +++ b/src/mbgl/gl/context.cpp @@ -72,10 +72,9 @@ GLint getMaxVertexAttribs() { } } // namespace -Context::Context(RendererBackend& backend_, TaggedScheduler scheduler_) +Context::Context(RendererBackend& backend_) : gfx::Context(/*maximumVertexBindingCount=*/getMaxVertexAttribs()), - backend(backend_), - scheduler(std::move(scheduler_)) { + backend(backend_) { #if MLN_DRAWABLE_RENDERER uboAllocator = std::make_unique(); #endif @@ -83,7 +82,7 @@ Context::Context(RendererBackend& backend_, TaggedScheduler scheduler_) Context::~Context() noexcept { if (cleanupOnDestruction) { - scheduler.runRenderJobs(true /* closeQueue */); + backend.getThreadPool().runRenderJobs(true /* closeQueue */); reset(); #if !defined(NDEBUG) @@ -94,7 +93,7 @@ Context::~Context() noexcept { } void Context::beginFrame() { - scheduler.runRenderJobs(); + backend.getThreadPool().runRenderJobs(); #if MLN_DRAWABLE_RENDERER frameInFlightFence = std::make_shared(); diff --git a/src/mbgl/gl/context.hpp b/src/mbgl/gl/context.hpp index 32799f5b786..5e8a0696842 100644 --- a/src/mbgl/gl/context.hpp +++ b/src/mbgl/gl/context.hpp @@ -40,7 +40,7 @@ class Debugging; class Context final : public gfx::Context { public: - Context(RendererBackend&, TaggedScheduler); + Context(RendererBackend&); ~Context() noexcept override; Context(const Context&) = delete; Context& operator=(const Context& other) = delete; @@ -153,7 +153,6 @@ class Context final : public gfx::Context { private: RendererBackend& backend; - TaggedScheduler scheduler; bool cleanupOnDestruction = true; std::unique_ptr debugging; diff --git a/src/mbgl/gl/renderer_backend.cpp b/src/mbgl/gl/renderer_backend.cpp index ddb7933aa7e..9b10b502b2c 100644 --- a/src/mbgl/gl/renderer_backend.cpp +++ b/src/mbgl/gl/renderer_backend.cpp @@ -15,12 +15,11 @@ namespace mbgl { namespace gl { -RendererBackend::RendererBackend(const gfx::ContextMode contextMode_, mbgl::Map* map) - : gfx::RendererBackend(contextMode_, map) {} +RendererBackend::RendererBackend(const gfx::ContextMode contextMode_) + : gfx::RendererBackend(contextMode_) {} std::unique_ptr RendererBackend::createContext() { - auto result = std::make_unique(*this, - TaggedScheduler{Scheduler::GetBackground(), static_cast(owner)}); + auto result = std::make_unique(*this); // Tagged background thread pool will be owned by the RendererBackend result->enableDebugging(); result->initializeExtensions(std::bind(&RendererBackend::getExtensionFunctionPointer, this, std::placeholders::_1)); return result; diff --git a/src/mbgl/mtl/context.cpp b/src/mbgl/mtl/context.cpp index b61c18789d3..b26f2b93d8b 100644 --- a/src/mbgl/mtl/context.cpp +++ b/src/mbgl/mtl/context.cpp @@ -38,14 +38,13 @@ namespace mtl { // 31 for Apple2-8, Mac2, per https://developer.apple.com/metal/Metal-Feature-Set-Tables.pdf constexpr uint32_t maximumVertexBindingCount = 31; -Context::Context(RendererBackend& backend_, TaggedScheduler scheduler_) +Context::Context(RendererBackend& backend_) : gfx::Context(mtl::maximumVertexBindingCount), - backend(backend_), - scheduler(std::move(scheduler_)) {} + backend(backend_) {} Context::~Context() noexcept { if (cleanupOnDestruction) { - scheduler.runRenderJobs(true /* closeQueue */); + backend.getThreadPool().runRenderJobs(true /* closeQueue */); performCleanup(); emptyVertexBuffer.reset(); @@ -69,7 +68,7 @@ Context::~Context() noexcept { } void Context::beginFrame() { - scheduler.runRenderJobs(); + backend.getThreadPool().runRenderJobs(); } void Context::endFrame() {} diff --git a/src/mbgl/renderer/render_orchestrator.cpp b/src/mbgl/renderer/render_orchestrator.cpp index d4ef2906e63..515f2eb8bd3 100644 --- a/src/mbgl/renderer/render_orchestrator.cpp +++ b/src/mbgl/renderer/render_orchestrator.cpp @@ -111,7 +111,7 @@ class RenderTreeImpl final : public RenderTree { } // namespace -RenderOrchestrator::RenderOrchestrator(bool backgroundLayerAsColor_, const std::optional& localFontFamily_) +RenderOrchestrator::RenderOrchestrator(bool backgroundLayerAsColor_, TaggedScheduler& threadPool_, const std::optional& localFontFamily_) : observer(&nullObserver()), glyphManager(std::make_unique(std::make_unique(localFontFamily_))), imageManager(std::make_unique()), @@ -122,7 +122,7 @@ RenderOrchestrator::RenderOrchestrator(bool backgroundLayerAsColor_, const std:: layerImpls(makeMutable>>()), renderLight(makeMutable()), backgroundLayerAsColor(backgroundLayerAsColor_), - threadPool(Scheduler::GetBackground(), static_cast(this)) { + threadPool(threadPool_) { glyphManager->setObserver(this); imageManager->setObserver(this); } @@ -187,7 +187,8 @@ std::unique_ptr RenderOrchestrator::createRenderTree( updateParameters->annotationManager, imageManager, glyphManager, - updateParameters->prefetchZoomDelta}; + updateParameters->prefetchZoomDelta, + threadPool}; glyphManager->setURL(updateParameters->glyphURL); diff --git a/src/mbgl/renderer/render_orchestrator.hpp b/src/mbgl/renderer/render_orchestrator.hpp index aff3ee722fe..e035a817dce 100644 --- a/src/mbgl/renderer/render_orchestrator.hpp +++ b/src/mbgl/renderer/render_orchestrator.hpp @@ -2,6 +2,7 @@ #if MLN_DRAWABLE_RENDERER #include #endif +#include #include #include #include @@ -55,7 +56,7 @@ using ImmutableLayer = Immutable; class RenderOrchestrator final : public GlyphManagerObserver, public ImageManagerObserver, public RenderSourceObserver { public: - RenderOrchestrator(bool backgroundLayerAsColor_, const std::optional& localFontFamily_); + RenderOrchestrator(bool backgroundLayerAsColor_, TaggedScheduler& threadPool_, const std::optional& localFontFamily_); ~RenderOrchestrator() override; void markContextLost() { contextLost = true; }; diff --git a/src/mbgl/renderer/renderer_impl.cpp b/src/mbgl/renderer/renderer_impl.cpp index 2477b1d63e4..c27bef787f1 100644 --- a/src/mbgl/renderer/renderer_impl.cpp +++ b/src/mbgl/renderer/renderer_impl.cpp @@ -58,7 +58,7 @@ RendererObserver& nullObserver() { Renderer::Impl::Impl(gfx::RendererBackend& backend_, float pixelRatio_, const std::optional& localFontFamily_) - : orchestrator(!backend_.contextIsShared(), localFontFamily_), + : orchestrator(!backend_.contextIsShared(), backend_.getThreadPool(), localFontFamily_), backend(backend_), observer(&nullObserver()), pixelRatio(pixelRatio_) {} diff --git a/src/mbgl/renderer/tile_parameters.hpp b/src/mbgl/renderer/tile_parameters.hpp index b7ada67d636..75c1c152f4f 100644 --- a/src/mbgl/renderer/tile_parameters.hpp +++ b/src/mbgl/renderer/tile_parameters.hpp @@ -1,6 +1,7 @@ #pragma once #include +#include #include @@ -25,6 +26,7 @@ class TileParameters { std::shared_ptr imageManager; std::shared_ptr glyphManager; const uint8_t prefetchZoomDelta; + TaggedScheduler threadPool; }; } // namespace mbgl diff --git a/src/mbgl/tile/geometry_tile.cpp b/src/mbgl/tile/geometry_tile.cpp index 59530636fae..242082308fd 100644 --- a/src/mbgl/tile/geometry_tile.cpp +++ b/src/mbgl/tile/geometry_tile.cpp @@ -156,15 +156,15 @@ const LayerRenderData* GeometryTileRenderData::getLayerRenderData(const style::L that could flag the tile as non-pending too early. */ -GeometryTile::GeometryTile(const OverscaledTileID& id_, std::string sourceID_, const TileParameters& parameters, TaggedScheduler& scheduler) +GeometryTile::GeometryTile(const OverscaledTileID& id_, std::string sourceID_, const TileParameters& parameters) : Tile(Kind::Geometry, id_), ImageRequestor(parameters.imageManager), sourceID(std::move(sourceID_)), - threadPool(scheduler), + threadPool(parameters.threadPool), mailbox(std::make_shared(*Scheduler::GetCurrent())), - worker(threadPool, // TaggedScheduler reference for the Actor retainer + worker(parameters.threadPool, // Scheduler reference for the Actor retainer ActorRef(*this, mailbox), - threadPool, // TaggedScheduler reference for the worker + parameters.threadPool, id_, sourceID, obsolete, diff --git a/src/mbgl/tile/geometry_tile.hpp b/src/mbgl/tile/geometry_tile.hpp index ced49eb2c92..7c4a0d286d3 100644 --- a/src/mbgl/tile/geometry_tile.hpp +++ b/src/mbgl/tile/geometry_tile.hpp @@ -28,7 +28,7 @@ class TileAtlasTextures; class GeometryTile : public Tile, public GlyphRequestor, public ImageRequestor { public: - GeometryTile(const OverscaledTileID&, std::string sourceID, const TileParameters&, TaggedScheduler& scheduler); + GeometryTile(const OverscaledTileID&, std::string sourceID, const TileParameters&); ~GeometryTile() override; diff --git a/src/mbgl/tile/geometry_tile_worker.cpp b/src/mbgl/tile/geometry_tile_worker.cpp index 4983c35835f..2c0adf1dedd 100644 --- a/src/mbgl/tile/geometry_tile_worker.cpp +++ b/src/mbgl/tile/geometry_tile_worker.cpp @@ -30,7 +30,7 @@ using namespace style; GeometryTileWorker::GeometryTileWorker(ActorRef self_, ActorRef parent_, - TaggedScheduler& scheduler_, + const TaggedScheduler& scheduler_, OverscaledTileID id_, std::string sourceID_, const std::atomic& obsolete_, diff --git a/src/mbgl/tile/geometry_tile_worker.hpp b/src/mbgl/tile/geometry_tile_worker.hpp index b2d836cbef3..ccd54652009 100644 --- a/src/mbgl/tile/geometry_tile_worker.hpp +++ b/src/mbgl/tile/geometry_tile_worker.hpp @@ -30,7 +30,7 @@ class GeometryTileWorker { public: GeometryTileWorker(ActorRef self, ActorRef parent, - TaggedScheduler& scheduler_, + const TaggedScheduler& scheduler_, OverscaledTileID, std::string, const std::atomic&, diff --git a/src/mbgl/util/thread_pool.cpp b/src/mbgl/util/thread_pool.cpp index b1a90d2c8ba..0ddf8acdf51 100644 --- a/src/mbgl/util/thread_pool.cpp +++ b/src/mbgl/util/thread_pool.cpp @@ -11,9 +11,6 @@ namespace mbgl { ThreadedSchedulerBase::~ThreadedSchedulerBase() = default; void ThreadedSchedulerBase::terminate() { - // Run any leftover render jobs - runRenderJobs(); - { std::lock_guard lock(workerMutex); terminated = true; diff --git a/src/mbgl/util/thread_pool.hpp b/src/mbgl/util/thread_pool.hpp index 11d4f4605cf..aa0efd823ad 100644 --- a/src/mbgl/util/thread_pool.hpp +++ b/src/mbgl/util/thread_pool.hpp @@ -141,7 +141,6 @@ class ThreadedScheduler : public ThreadedSchedulerBase { private: std::vector threads; - mapbox::base::WeakPtrFactory weakFactory{this}; struct RenderQueue { std::queue> queue; @@ -149,6 +148,8 @@ class ThreadedScheduler : public ThreadedSchedulerBase { }; mbgl::unordered_map> taggedRenderQueue; std::mutex taggedRenderQueueLock; + + mapbox::base::WeakPtrFactory weakFactory{this}; }; class SequencedScheduler : public ThreadedScheduler { diff --git a/test/util/async_task.test.cpp b/test/util/async_task.test.cpp index e264a4ceb83..e8b2f4c39e5 100644 --- a/test/util/async_task.test.cpp +++ b/test/util/async_task.test.cpp @@ -104,8 +104,8 @@ TEST(AsyncTask, RequestCoalescingMultithreaded) { unsigned count = 0, numThreads = 25; AsyncTask async([&count] { ++count; }); - std::shared_ptr retainer = Scheduler::GetBackground(); - auto mailbox = std::make_shared(*retainer); + TaggedScheduler retainer = {Scheduler::GetBackground(), &loop}; + auto mailbox = std::make_shared(retainer); TestWorker worker(&async); ActorRef workerRef(worker, mailbox); @@ -133,8 +133,8 @@ TEST(AsyncTask, ThreadSafety) { AsyncTask async([&count] { ++count; }); - std::shared_ptr retainer = Scheduler::GetBackground(); - auto mailbox = std::make_shared(*retainer); + TaggedScheduler retainer = {Scheduler::GetBackground(), &loop}; + auto mailbox = std::make_shared(retainer); TestWorker worker(&async); ActorRef workerRef(worker, mailbox);