From f62e5b00c98b50e9d9a1e76f4ae5e70129e83ff4 Mon Sep 17 00:00:00 2001 From: Mikhail Pozdnyakov Date: Wed, 9 Oct 2019 16:23:12 +0300 Subject: [core] Introduce Scheduler::makeWeakPtr() --- include/mbgl/actor/scheduler.hpp | 4 ++++ include/mbgl/util/run_loop.hpp | 2 ++ platform/android/src/map_renderer.hpp | 2 ++ platform/qt/src/qmapboxgl_scheduler.hpp | 2 ++ src/mbgl/util/thread_pool.hpp | 3 +++ test/actor/actor.test.cpp | 2 ++ 6 files changed, 15 insertions(+) diff --git a/include/mbgl/actor/scheduler.hpp b/include/mbgl/actor/scheduler.hpp index ca34901cfd..7338c3ab3a 100644 --- a/include/mbgl/actor/scheduler.hpp +++ b/include/mbgl/actor/scheduler.hpp @@ -1,5 +1,7 @@ #pragma once +#include + #include #include @@ -35,6 +37,8 @@ public: // Enqueues a function for execution. virtual void schedule(std::function) = 0; + // Makes a weak pointer to this Scheduler. + virtual mapbox::base::WeakPtr makeWeakPtr() = 0; // Set/Get the current Scheduler for this thread static Scheduler* GetCurrent(); diff --git a/include/mbgl/util/run_loop.hpp b/include/mbgl/util/run_loop.hpp index 961573fd87..5cde95a531 100644 --- a/include/mbgl/util/run_loop.hpp +++ b/include/mbgl/util/run_loop.hpp @@ -74,6 +74,7 @@ public: } void schedule(std::function fn) override { invoke(std::move(fn)); } + ::mapbox::base::WeakPtr makeWeakPtr() override { return weakFactory.makeWeakPtr(); } class Impl; @@ -121,6 +122,7 @@ private: std::mutex mutex; std::unique_ptr impl; + ::mapbox::base::WeakPtrFactory weakFactory{this}; }; } // namespace util diff --git a/platform/android/src/map_renderer.hpp b/platform/android/src/map_renderer.hpp index 664da20a94..047f1870c7 100644 --- a/platform/android/src/map_renderer.hpp +++ b/platform/android/src/map_renderer.hpp @@ -68,6 +68,7 @@ public: // From Scheduler. Schedules by using callbacks to the // JVM to process the mailbox on the right thread. void schedule(std::function scheduled) override; + mapbox::base::WeakPtr makeWeakPtr() override { return weakFactory.makeWeakPtr(); } void requestRender(); @@ -122,6 +123,7 @@ private: std::atomic destroyed {false}; std::unique_ptr snapshotCallback; + mapbox::base::WeakPtrFactory weakFactory{this}; }; } // namespace android diff --git a/platform/qt/src/qmapboxgl_scheduler.hpp b/platform/qt/src/qmapboxgl_scheduler.hpp index b34dd3d5b8..0b000b9fcc 100644 --- a/platform/qt/src/qmapboxgl_scheduler.hpp +++ b/platform/qt/src/qmapboxgl_scheduler.hpp @@ -19,6 +19,7 @@ public: // mbgl::Scheduler implementation. void schedule(std::function scheduled) final; + mapbox::base::WeakPtr makeWeakPtr() override { return weakFactory.makeWeakPtr(); } void processEvents(); @@ -30,4 +31,5 @@ private: std::mutex m_taskQueueMutex; std::queue> m_taskQueue; + mapbox::base::WeakPtrFactory weakFactory{this}; }; diff --git a/src/mbgl/util/thread_pool.hpp b/src/mbgl/util/thread_pool.hpp index f302e50914..7642f9b4ca 100644 --- a/src/mbgl/util/thread_pool.hpp +++ b/src/mbgl/util/thread_pool.hpp @@ -52,8 +52,11 @@ public: } } + mapbox::base::WeakPtr makeWeakPtr() override { return weakFactory.makeWeakPtr(); } + private: std::array threads; + mapbox::base::WeakPtrFactory weakFactory{this}; static_assert(N > 0, "Thread count must be more than zero."); }; diff --git a/test/actor/actor.test.cpp b/test/actor/actor.test.cpp index 4b152f471a..c2a41fe787 100644 --- a/test/actor/actor.test.cpp +++ b/test/actor/actor.test.cpp @@ -90,6 +90,7 @@ TEST(Actor, DestructionBlocksOnSend) { std::promise promise; std::future future; std::atomic waited; + mapbox::base::WeakPtrFactory weakFactory{this}; TestScheduler(std::promise promise_, std::future future_) : promise(std::move(promise_)), @@ -107,6 +108,7 @@ TEST(Actor, DestructionBlocksOnSend) { std::this_thread::sleep_for(1ms); waited = true; } + mapbox::base::WeakPtr makeWeakPtr() override { return weakFactory.makeWeakPtr(); } }; struct Test { -- cgit v1.2.1