diff options
author | Łukasz Paczos <lukas.paczos@gmail.com> | 2019-04-15 18:36:51 +0200 |
---|---|---|
committer | Łukasz Paczos <lukasz.paczos@mapbox.com> | 2019-04-18 15:52:33 +0200 |
commit | df9a998543e0ccbbf9d08906dbc376ebf4e3d217 (patch) | |
tree | 8a00f341bd71dbfc8aab2a30bf9981424dd5c61b | |
parent | cd5f87e9d2f373d1a6c7797de767e545b52cddcc (diff) | |
download | qtlocation-mapboxgl-df9a998543e0ccbbf9d08906dbc376ebf4e3d217.tar.gz |
[android] Android specific thread pool that keeps threads attached to JVM
-rw-r--r-- | platform/android/core-files.json | 4 | ||||
-rw-r--r-- | platform/android/src/android_thread_pool.cpp | 18 | ||||
-rw-r--r-- | platform/android/src/android_thread_pool.hpp | 23 | ||||
-rw-r--r-- | platform/android/src/shared_thread_pool.cpp | 15 | ||||
-rw-r--r-- | platform/default/include/mbgl/util/default_thread_pool.hpp | 10 | ||||
-rw-r--r-- | platform/default/src/mbgl/util/default_thread_pool.cpp | 10 |
6 files changed, 77 insertions, 3 deletions
diff --git a/platform/android/core-files.json b/platform/android/core-files.json index 20dcc12c7d..eaa8fc272d 100644 --- a/platform/android/core-files.json +++ b/platform/android/core-files.json @@ -85,13 +85,14 @@ "platform/android/src/thread.cpp", "platform/android/src/timer.cpp", "platform/android/src/unaccent.cpp", + "platform/android/src/android_thread_pool.cpp", + "platform/android/src/shared_thread_pool.cpp", "platform/default/src/mbgl/gl/headless_backend.cpp", "platform/default/src/mbgl/gl/headless_frontend.cpp", "platform/default/src/mbgl/map/map_snapshotter.cpp", "platform/default/src/mbgl/text/bidi.cpp", "platform/default/src/mbgl/util/default_thread_pool.cpp", "platform/default/src/mbgl/util/png_writer.cpp", - "platform/default/src/mbgl/util/shared_thread_pool.cpp", "platform/default/src/mbgl/util/thread_local.cpp", "platform/default/src/mbgl/util/utf.cpp", "platform/linux/src/headless_backend_egl.cpp" @@ -150,6 +151,7 @@ "map_renderer_runnable.hpp": "platform/android/src/map_renderer_runnable.hpp", "native_map_view.hpp": "platform/android/src/native_map_view.hpp", "run_loop_impl.hpp": "platform/android/src/run_loop_impl.hpp", + "android_thread_pool.hpp": "platform/android/src/android_thread_pool.hpp", "snapshotter/map_snapshot.hpp": "platform/android/src/snapshotter/map_snapshot.hpp", "snapshotter/map_snapshotter.hpp": "platform/android/src/snapshotter/map_snapshotter.hpp", "style/android_conversion.hpp": "platform/android/src/style/android_conversion.hpp", diff --git a/platform/android/src/android_thread_pool.cpp b/platform/android/src/android_thread_pool.cpp new file mode 100644 index 0000000000..3c1ef4ac46 --- /dev/null +++ b/platform/android/src/android_thread_pool.cpp @@ -0,0 +1,18 @@ +#include "android_thread_pool.hpp" +#include <mbgl/util/platform.hpp> + +namespace mbgl { +namespace android { + +void AndroidThreadLifecycle::onThreadCreated() const { + attach_jni_thread(theJVM, &env, platform::getCurrentThreadName()); +} + +void AndroidThreadLifecycle::onThreadDestroyed() const { + detach_jni_thread(theJVM, &env, true); +} + +AndroidThreadPool::AndroidThreadPool(size_t count) : mbgl::ThreadPool(count, std::make_unique<AndroidThreadLifecycle>()) {} + +} // namespace android +} // namespace mbgl diff --git a/platform/android/src/android_thread_pool.hpp b/platform/android/src/android_thread_pool.hpp new file mode 100644 index 0000000000..fd32018099 --- /dev/null +++ b/platform/android/src/android_thread_pool.hpp @@ -0,0 +1,23 @@ +#pragma once +#include <mbgl/util/default_thread_pool.hpp> +#include "jni.hpp" + +namespace mbgl { +namespace android { + +class AndroidThreadLifecycle : public mbgl::ThreadLifecycle { +public: + void onThreadCreated() const override; + void onThreadDestroyed() const override; + +private: + mutable JNIEnv *env = nullptr; +}; + +class AndroidThreadPool : public mbgl::ThreadPool { +public: + explicit AndroidThreadPool(size_t count); +}; + +} // namespace android +} // namespace mbgl diff --git a/platform/android/src/shared_thread_pool.cpp b/platform/android/src/shared_thread_pool.cpp new file mode 100644 index 0000000000..4caac34a32 --- /dev/null +++ b/platform/android/src/shared_thread_pool.cpp @@ -0,0 +1,15 @@ +#include <mbgl/util/shared_thread_pool.hpp> +#include "android_thread_pool.hpp" + +namespace mbgl { + +std::shared_ptr<ThreadPool> sharedThreadPool() { + static std::weak_ptr<ThreadPool> weak; + auto pool = weak.lock(); + if (!pool) { + weak = pool = std::make_shared<android::AndroidThreadPool>(4); + } + return pool; +} + +} // namespace mbgl diff --git a/platform/default/include/mbgl/util/default_thread_pool.hpp b/platform/default/include/mbgl/util/default_thread_pool.hpp index a14d16d771..c28e369f71 100644 --- a/platform/default/include/mbgl/util/default_thread_pool.hpp +++ b/platform/default/include/mbgl/util/default_thread_pool.hpp @@ -9,14 +9,22 @@ namespace mbgl { +struct ThreadLifecycle { + virtual void onThreadCreated() const = 0; + virtual void onThreadDestroyed() const = 0; + virtual ~ThreadLifecycle() = default; +}; + class ThreadPool : public Scheduler { public: - ThreadPool(std::size_t count); + explicit ThreadPool(std::size_t count); + ThreadPool(std::size_t count, std::unique_ptr<ThreadLifecycle> _lifecycle); ~ThreadPool() override; void schedule(std::weak_ptr<Mailbox>) override; private: + std::unique_ptr<ThreadLifecycle> lifecycle; std::vector<std::thread> threads; std::queue<std::weak_ptr<Mailbox>> queue; std::mutex mutex; diff --git a/platform/default/src/mbgl/util/default_thread_pool.cpp b/platform/default/src/mbgl/util/default_thread_pool.cpp index d3950bb8aa..e24fe9e80e 100644 --- a/platform/default/src/mbgl/util/default_thread_pool.cpp +++ b/platform/default/src/mbgl/util/default_thread_pool.cpp @@ -5,11 +5,16 @@ namespace mbgl { -ThreadPool::ThreadPool(std::size_t count) { +ThreadPool::ThreadPool(std::size_t count) : ThreadPool::ThreadPool(count, nullptr) {} + +ThreadPool::ThreadPool(std::size_t count, std::unique_ptr<ThreadLifecycle > _lifecycle) : lifecycle(std::move(_lifecycle)) { 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)); + if (lifecycle) { + lifecycle->onThreadCreated(); + } while (true) { std::unique_lock<std::mutex> lock(mutex); @@ -19,6 +24,9 @@ ThreadPool::ThreadPool(std::size_t count) { }); if (terminate) { + if (lifecycle) { + lifecycle->onThreadDestroyed(); + } return; } |