summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
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
commitdf9a998543e0ccbbf9d08906dbc376ebf4e3d217 (patch)
tree8a00f341bd71dbfc8aab2a30bf9981424dd5c61b
parentcd5f87e9d2f373d1a6c7797de767e545b52cddcc (diff)
downloadqtlocation-mapboxgl-df9a998543e0ccbbf9d08906dbc376ebf4e3d217.tar.gz
[android] Android specific thread pool that keeps threads attached to JVM
-rw-r--r--platform/android/core-files.json4
-rw-r--r--platform/android/src/android_thread_pool.cpp18
-rw-r--r--platform/android/src/android_thread_pool.hpp23
-rw-r--r--platform/android/src/shared_thread_pool.cpp15
-rw-r--r--platform/default/include/mbgl/util/default_thread_pool.hpp10
-rw-r--r--platform/default/src/mbgl/util/default_thread_pool.cpp10
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;
}