diff options
author | Alexander Shalamov <alexander.shalamov@mapbox.com> | 2020-01-31 17:06:37 +0200 |
---|---|---|
committer | Alexander Shalamov <alexander.shalamov@mapbox.com> | 2020-02-06 23:54:19 +0200 |
commit | bb85ec442dd7b5b0966d73bc6b868d33bb03e5e9 (patch) | |
tree | e0fef3271ab6e4f21b05f4f00dd6aa4386efd499 | |
parent | 4be2fa4f9af29cfad869412d2d794964554d4eba (diff) | |
download | qtlocation-mapboxgl-bb85ec442dd7b5b0966d73bc6b868d33bb03e5e9.tar.gz |
[core] Add hooks for setting experimental thread priorities for mbgl threads
-rw-r--r-- | include/mbgl/util/thread.hpp | 38 | ||||
-rw-r--r-- | next/CMakeLists.txt | 1 | ||||
-rw-r--r-- | platform/android/src/asset_manager_file_source.cpp | 11 | ||||
-rw-r--r-- | platform/default/src/mbgl/storage/asset_file_source.cpp | 5 | ||||
-rw-r--r-- | platform/default/src/mbgl/storage/database_file_source.cpp | 7 | ||||
-rw-r--r-- | platform/default/src/mbgl/storage/local_file_source.cpp | 5 | ||||
-rw-r--r-- | platform/default/src/mbgl/storage/main_resource_loader.cpp | 8 | ||||
-rw-r--r-- | platform/default/src/mbgl/storage/online_file_source.cpp | 11 | ||||
-rw-r--r-- | src/core-files.json | 3 | ||||
-rw-r--r-- | src/mbgl/util/thread.cpp | 19 | ||||
-rw-r--r-- | src/mbgl/util/thread_pool.cpp | 11 |
11 files changed, 88 insertions, 31 deletions
diff --git a/include/mbgl/util/thread.hpp b/include/mbgl/util/thread.hpp index ab0403e44e..4bc948fdbd 100644 --- a/include/mbgl/util/thread.hpp +++ b/include/mbgl/util/thread.hpp @@ -3,10 +3,10 @@ #include <mbgl/actor/actor.hpp> #include <mbgl/actor/mailbox.hpp> #include <mbgl/actor/scheduler.hpp> +#include <mbgl/platform/thread.hpp> #include <mbgl/util/platform.hpp> #include <mbgl/util/run_loop.hpp> #include <mbgl/util/util.hpp> -#include <mbgl/platform/thread.hpp> #include <cassert> #include <future> @@ -37,25 +37,20 @@ namespace util { // - A `RunLoop` is created for the `Object` thread. // - `Object` can use `Timer` and do asynchronous I/O, like wait for sockets events. // -template<class Object> +template <typename Object> class Thread { public: - template <class... Args> - Thread(const std::string& name, Args&&... args) { - + template <typename TupleArgs> + Thread(std::function<void()> prioritySetter_, const std::string& name, TupleArgs&& args) { std::promise<void> running_; running = running_.get_future(); - - auto capturedArgs = std::make_tuple(std::forward<Args>(args)...); - - thread = std::thread([ - this, - name, - capturedArgs = std::move(capturedArgs), - runningPromise = std::move(running_) - ] () mutable { + thread = std::thread([this, + name, + capturedArgs = std::forward<TupleArgs>(args), + runningPromise = std::move(running_), + prioritySetter = std::move(prioritySetter_)]() mutable { platform::setCurrentThreadName(name); - platform::makeThreadLowPriority(); + if (prioritySetter) prioritySetter(); platform::attachThread(); // narrowing the scope to release the Object before we detach the thread @@ -77,6 +72,14 @@ public: }); } + template <typename... Args> + Thread(const std::string& name, Args&&... args) + : Thread([] { platform::makeThreadLowPriority(); }, name, std::make_tuple(std::forward<Args>(args)...)) {} + + template <typename... Args> + Thread(std::function<void()> prioritySetter, const std::string& name, Args&&... args) + : Thread(std::move(prioritySetter), name, std::make_tuple(std::forward<Args>(args)...)) {} + ~Thread() { if (paused) { resume(); @@ -158,5 +161,10 @@ private: util::RunLoop* loop = nullptr; }; +// Returns function, that once invoked, will set a thread priority for +// a thread `threadType` based on a setting provided by corresponding +// Settings' platform::EXPERIMENTAL_THREAD_PRIORITY_* value. +std::function<void()> makeThreadPrioritySetter(std::string threadType); + } // namespace util } // namespace mbgl diff --git a/next/CMakeLists.txt b/next/CMakeLists.txt index e956f3e5db..50b1f62ccc 100644 --- a/next/CMakeLists.txt +++ b/next/CMakeLists.txt @@ -780,6 +780,7 @@ add_library( ${MBGL_ROOT}/src/mbgl/util/stopwatch.cpp ${MBGL_ROOT}/src/mbgl/util/stopwatch.hpp ${MBGL_ROOT}/src/mbgl/util/string.cpp + ${MBGL_ROOT}/src/mbgl/util/thread.cpp ${MBGL_ROOT}/src/mbgl/util/thread_local.hpp ${MBGL_ROOT}/src/mbgl/util/thread_pool.cpp ${MBGL_ROOT}/src/mbgl/util/thread_pool.hpp diff --git a/platform/android/src/asset_manager_file_source.cpp b/platform/android/src/asset_manager_file_source.cpp index 73ecec2b05..a8045a2b96 100644 --- a/platform/android/src/asset_manager_file_source.cpp +++ b/platform/android/src/asset_manager_file_source.cpp @@ -1,5 +1,6 @@ #include "asset_manager_file_source.hpp" +#include <mbgl/platform/settings.hpp> #include <mbgl/storage/file_source_request.hpp> #include <mbgl/storage/resource.hpp> #include <mbgl/storage/response.hpp> @@ -39,11 +40,13 @@ private: AAssetManager* assetManager; }; -AssetManagerFileSource::AssetManagerFileSource(jni::JNIEnv& env, const jni::Object<android::AssetManager>& assetManager_) +AssetManagerFileSource::AssetManagerFileSource(jni::JNIEnv& env, + const jni::Object<android::AssetManager>& assetManager_) : assetManager(jni::NewGlobal(env, assetManager_)), - impl(std::make_unique<util::Thread<Impl>>("AssetManagerFileSource", - AAssetManager_fromJava(&env, jni::Unwrap(assetManager.get())))) { -} + impl(std::make_unique<util::Thread<Impl>>( + util::makeThreadPrioritySetter(platform::EXPERIMENTAL_THREAD_PRIORITY_FILE), + "AssetManagerFileSource", + AAssetManager_fromJava(&env, jni::Unwrap(assetManager.get())))) {} AssetManagerFileSource::~AssetManagerFileSource() = default; diff --git a/platform/default/src/mbgl/storage/asset_file_source.cpp b/platform/default/src/mbgl/storage/asset_file_source.cpp index 7abd609b19..a9ede06508 100644 --- a/platform/default/src/mbgl/storage/asset_file_source.cpp +++ b/platform/default/src/mbgl/storage/asset_file_source.cpp @@ -1,3 +1,4 @@ +#include <mbgl/platform/settings.hpp> #include <mbgl/storage/asset_file_source.hpp> #include <mbgl/storage/file_source_request.hpp> #include <mbgl/storage/local_file_request.hpp> @@ -42,8 +43,8 @@ private: }; AssetFileSource::AssetFileSource(const std::string& root) - : impl(std::make_unique<util::Thread<Impl>>("AssetFileSource", root)) { -} + : impl(std::make_unique<util::Thread<Impl>>( + util::makeThreadPrioritySetter(platform::EXPERIMENTAL_THREAD_PRIORITY_FILE), "AssetFileSource", root)) {} AssetFileSource::~AssetFileSource() = default; diff --git a/platform/default/src/mbgl/storage/database_file_source.cpp b/platform/default/src/mbgl/storage/database_file_source.cpp index b46693849a..f0b4849cb0 100644 --- a/platform/default/src/mbgl/storage/database_file_source.cpp +++ b/platform/default/src/mbgl/storage/database_file_source.cpp @@ -1,3 +1,4 @@ +#include <mbgl/platform/settings.hpp> #include <mbgl/storage/database_file_source.hpp> #include <mbgl/storage/file_source_manager.hpp> #include <mbgl/storage/file_source_request.hpp> @@ -7,6 +8,7 @@ #include <mbgl/storage/response.hpp> #include <mbgl/util/constants.hpp> #include <mbgl/util/logging.hpp> +#include <mbgl/util/platform.hpp> #include <mbgl/util/thread.hpp> namespace mbgl { @@ -149,7 +151,10 @@ class DatabaseFileSource::Impl { public: Impl(std::shared_ptr<FileSource> onlineFileSource, const std::string& cachePath) : thread(std::make_unique<util::Thread<DatabaseFileSourceThread>>( - "DatabaseFileSource", std::move(onlineFileSource), cachePath)) {} + util::makeThreadPrioritySetter(platform::EXPERIMENTAL_THREAD_PRIORITY_DATABASE), + "DatabaseFileSource", + std::move(onlineFileSource), + cachePath)) {} ActorRef<DatabaseFileSourceThread> actor() const { return thread->actor(); } diff --git a/platform/default/src/mbgl/storage/local_file_source.cpp b/platform/default/src/mbgl/storage/local_file_source.cpp index 54f12baf79..5009146c8e 100644 --- a/platform/default/src/mbgl/storage/local_file_source.cpp +++ b/platform/default/src/mbgl/storage/local_file_source.cpp @@ -1,3 +1,4 @@ +#include <mbgl/platform/settings.hpp> #include <mbgl/storage/file_source_request.hpp> #include <mbgl/storage/local_file_request.hpp> #include <mbgl/storage/local_file_source.hpp> @@ -36,8 +37,8 @@ public: }; LocalFileSource::LocalFileSource() - : impl(std::make_unique<util::Thread<Impl>>("LocalFileSource")) { -} + : impl(std::make_unique<util::Thread<Impl>>( + util::makeThreadPrioritySetter(platform::EXPERIMENTAL_THREAD_PRIORITY_FILE), "LocalFileSource")) {} LocalFileSource::~LocalFileSource() = default; diff --git a/platform/default/src/mbgl/storage/main_resource_loader.cpp b/platform/default/src/mbgl/storage/main_resource_loader.cpp index 91ae0a1d71..fb69a8c4f4 100644 --- a/platform/default/src/mbgl/storage/main_resource_loader.cpp +++ b/platform/default/src/mbgl/storage/main_resource_loader.cpp @@ -1,5 +1,6 @@ #include <mbgl/actor/actor.hpp> #include <mbgl/actor/scheduler.hpp> +#include <mbgl/platform/settings.hpp> #include <mbgl/storage/file_source_manager.hpp> #include <mbgl/storage/file_source_request.hpp> #include <mbgl/storage/main_resource_loader.hpp> @@ -131,7 +132,12 @@ public: onlineFileSource(std::move(onlineFileSource_)), supportsCacheOnlyRequests_(bool(databaseFileSource)), thread(std::make_unique<util::Thread<MainResourceLoaderThread>>( - "ResourceLoaderThread", assetFileSource, databaseFileSource, localFileSource, onlineFileSource)) {} + util::makeThreadPrioritySetter(platform::EXPERIMENTAL_THREAD_PRIORITY_WORKER), + "ResourceLoaderThread", + assetFileSource, + databaseFileSource, + localFileSource, + onlineFileSource)) {} std::unique_ptr<AsyncRequest> request(const Resource& resource, Callback callback) { auto req = std::make_unique<FileSourceRequest>(std::move(callback)); diff --git a/platform/default/src/mbgl/storage/online_file_source.cpp b/platform/default/src/mbgl/storage/online_file_source.cpp index 0f5b438e1d..37b1f7ca8e 100644 --- a/platform/default/src/mbgl/storage/online_file_source.cpp +++ b/platform/default/src/mbgl/storage/online_file_source.cpp @@ -1,8 +1,8 @@ -#include <mbgl/storage/online_file_source.hpp> +#include <mbgl/platform/settings.hpp> +#include <mbgl/storage/file_source_request.hpp> #include <mbgl/storage/http_file_source.hpp> #include <mbgl/storage/network_status.hpp> - -#include <mbgl/storage/file_source_request.hpp> +#include <mbgl/storage/online_file_source.hpp> #include <mbgl/storage/resource_transform.hpp> #include <mbgl/storage/response.hpp> #include <mbgl/util/logging.hpp> @@ -15,6 +15,7 @@ #include <mbgl/util/http_timeout.hpp> #include <mbgl/util/mapbox.hpp> #include <mbgl/util/noncopyable.hpp> +#include <mbgl/util/platform.hpp> #include <mbgl/util/run_loop.hpp> #include <mbgl/util/thread.hpp> #include <mbgl/util/timer.hpp> @@ -293,7 +294,9 @@ private: class OnlineFileSource::Impl { public: - Impl() : thread(std::make_unique<util::Thread<OnlineFileSourceThread>>("OnlineFileSource")) {} + Impl() + : thread(std::make_unique<util::Thread<OnlineFileSourceThread>>( + util::makeThreadPrioritySetter(platform::EXPERIMENTAL_THREAD_PRIORITY_NETWORK), "OnlineFileSource")) {} std::unique_ptr<AsyncRequest> request(Callback callback, Resource res) { auto req = std::make_unique<FileSourceRequest>(std::move(callback)); diff --git a/src/core-files.json b/src/core-files.json index 3c0e128b18..fe68df16bf 100644 --- a/src/core-files.json +++ b/src/core-files.json @@ -62,6 +62,7 @@ "src/mbgl/map/transform_state.cpp", "src/mbgl/math/log2.cpp", "src/mbgl/platform/gl_functions.cpp", + "src/mbgl/platform/settings.cpp", "src/mbgl/programs/background_program.cpp", "src/mbgl/programs/circle_program.cpp", "src/mbgl/programs/clipping_mask_program.cpp", @@ -316,6 +317,7 @@ "src/mbgl/util/rapidjson.cpp", "src/mbgl/util/stopwatch.cpp", "src/mbgl/util/string.cpp", + "src/mbgl/util/thread.cpp", "src/mbgl/util/thread_pool.cpp", "src/mbgl/util/tile_cover.cpp", "src/mbgl/util/tile_cover_impl.cpp", @@ -369,6 +371,7 @@ "mbgl/math/minmax.hpp": "include/mbgl/math/minmax.hpp", "mbgl/math/wrap.hpp": "include/mbgl/math/wrap.hpp", "mbgl/platform/gl_functions.hpp": "include/mbgl/platform/gl_functions.hpp", + "mbgl/platform/settings.hpp": "include/mbgl/platform/settings.hpp", "mbgl/platform/thread.hpp": "include/mbgl/platform/thread.hpp", "mbgl/renderer/query.hpp": "include/mbgl/renderer/query.hpp", "mbgl/renderer/renderer.hpp": "include/mbgl/renderer/renderer.hpp", diff --git a/src/mbgl/util/thread.cpp b/src/mbgl/util/thread.cpp new file mode 100644 index 0000000000..016d23a928 --- /dev/null +++ b/src/mbgl/util/thread.cpp @@ -0,0 +1,19 @@ +#include <functional> +#include <mbgl/platform/settings.hpp> +#include <mbgl/util/platform.hpp> + +namespace mbgl { +namespace util { +std::function<void()> makeThreadPrioritySetter(std::string threadType_) { + return [threadType = std::move(threadType_)] { + auto& settings = platform::Settings::getInstance(); + auto value = settings.get(threadType); + if (auto* priority = value.getDouble()) { + platform::setCurrentThreadPriority(*priority); + } else { + platform::makeThreadLowPriority(); + } + }; +} +} // namespace util +} // namespace mbgl diff --git a/src/mbgl/util/thread_pool.cpp b/src/mbgl/util/thread_pool.cpp index 040e996dd4..e1c18a45b5 100644 --- a/src/mbgl/util/thread_pool.cpp +++ b/src/mbgl/util/thread_pool.cpp @@ -1,8 +1,9 @@ #include <mbgl/util/thread_pool.hpp> +#include <mbgl/platform/settings.hpp> +#include <mbgl/platform/thread.hpp> #include <mbgl/util/platform.hpp> #include <mbgl/util/string.hpp> -#include <mbgl/platform/thread.hpp> namespace mbgl { @@ -17,7 +18,13 @@ void ThreadedSchedulerBase::terminate() { } std::thread ThreadedSchedulerBase::makeSchedulerThread(size_t index) { - return std::thread([this, index]() { + return std::thread([this, index] { + auto& settings = platform::Settings::getInstance(); + auto value = settings.get(platform::EXPERIMENTAL_THREAD_PRIORITY_WORKER); + if (auto* priority = value.getDouble()) { + platform::setCurrentThreadPriority(*priority); + } + platform::setCurrentThreadName(std::string{"Worker "} + util::toString(index + 1)); platform::attachThread(); |