From 3ef9e26593bfda1f32bc15d29016d9bb83acb67c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20K=C3=A4fer?= Date: Mon, 20 Feb 2017 14:59:17 +0100 Subject: [PATCH] [ios,macos,android,qt] use shared threadpool --- platform/android/config.cmake | 2 ++ platform/android/src/native_map_view.cpp | 5 +++-- platform/android/src/native_map_view.hpp | 2 +- platform/default/mbgl/util/default_thread_pool.cpp | 6 +++++- platform/default/mbgl/util/shared_thread_pool.cpp | 14 ++++++++++++++ platform/default/mbgl/util/shared_thread_pool.hpp | 9 +++++++++ platform/ios/config.cmake | 2 ++ platform/ios/src/MGLMapView.mm | 11 +++-------- platform/macos/config.cmake | 2 ++ platform/macos/src/MGLMapView.mm | 10 ++++------ platform/qt/qt.cmake | 4 +++- platform/qt/src/qmapboxgl.cpp | 5 +++-- platform/qt/src/qmapboxgl_p.hpp | 2 +- 13 files changed, 52 insertions(+), 22 deletions(-) create mode 100644 platform/default/mbgl/util/shared_thread_pool.cpp create mode 100644 platform/default/mbgl/util/shared_thread_pool.hpp diff --git a/platform/android/config.cmake b/platform/android/config.cmake index dc65e7a51..bda2c27e7 100644 --- a/platform/android/config.cmake +++ b/platform/android/config.cmake @@ -73,6 +73,8 @@ macro(mbgl_platform_core) PRIVATE platform/android/src/image.cpp # Thread pool + PRIVATE platform/default/mbgl/util/shared_thread_pool.cpp + PRIVATE platform/default/mbgl/util/shared_thread_pool.hpp PRIVATE platform/default/mbgl/util/default_thread_pool.cpp PRIVATE platform/default/mbgl/util/default_thread_pool.hpp diff --git a/platform/android/src/native_map_view.cpp b/platform/android/src/native_map_view.cpp index 129eb4c19..22711f154 100755 --- a/platform/android/src/native_map_view.cpp +++ b/platform/android/src/native_map_view.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include "bitmap.hpp" @@ -29,7 +30,7 @@ NativeMapView::NativeMapView(JNIEnv *env_, jobject obj_, float pixelRatio, int a availableProcessors(availableProcessors_), totalMemory(totalMemory_), fileSource(defaultFileSource(mbgl::android::cachePath + "/mbgl-offline.db", mbgl::android::apkPath)), - threadPool(4) { + threadPool(sharedThreadPool()) { assert(env_ != nullptr); assert(obj_ != nullptr); @@ -47,7 +48,7 @@ NativeMapView::NativeMapView(JNIEnv *env_, jobject obj_, float pixelRatio, int a map = std::make_unique( *this, mbgl::Size{ static_cast(width), static_cast(height) }, - pixelRatio, fileSource, threadPool, MapMode::Continuous); + pixelRatio, fileSource, *threadPool, MapMode::Continuous); float zoomFactor = map->getMaxZoom() - map->getMinZoom() + 1; float cpuFactor = availableProcessors; diff --git a/platform/android/src/native_map_view.hpp b/platform/android/src/native_map_view.hpp index 42c8a9f40..e776b839f 100755 --- a/platform/android/src/native_map_view.hpp +++ b/platform/android/src/native_map_view.hpp @@ -97,7 +97,7 @@ private: // Ensure these are initialised last mbgl::DefaultFileSource& fileSource; - mbgl::ThreadPool threadPool; + std::shared_ptr threadPool; std::unique_ptr map; mbgl::EdgeInsets insets; diff --git a/platform/default/mbgl/util/default_thread_pool.cpp b/platform/default/mbgl/util/default_thread_pool.cpp index 92c0f0674..d3950bb8a 100644 --- a/platform/default/mbgl/util/default_thread_pool.cpp +++ b/platform/default/mbgl/util/default_thread_pool.cpp @@ -1,12 +1,16 @@ #include #include +#include +#include namespace mbgl { ThreadPool::ThreadPool(std::size_t count) { threads.reserve(count); for (std::size_t i = 0; i < count; ++i) { - threads.emplace_back([this] () { + threads.emplace_back([this, i]() { + platform::setCurrentThreadName(std::string{ "Worker " } + util::toString(i + 1)); + while (true) { std::unique_lock lock(mutex); diff --git a/platform/default/mbgl/util/shared_thread_pool.cpp b/platform/default/mbgl/util/shared_thread_pool.cpp new file mode 100644 index 000000000..7a42df21d --- /dev/null +++ b/platform/default/mbgl/util/shared_thread_pool.cpp @@ -0,0 +1,14 @@ +#include "shared_thread_pool.hpp" + +namespace mbgl { + +std::shared_ptr sharedThreadPool() { + static std::weak_ptr weak; + auto pool = weak.lock(); + if (!pool) { + weak = pool = std::make_shared(4); + } + return pool; +} + +} // namespace mbgl diff --git a/platform/default/mbgl/util/shared_thread_pool.hpp b/platform/default/mbgl/util/shared_thread_pool.hpp new file mode 100644 index 000000000..04a3cb58d --- /dev/null +++ b/platform/default/mbgl/util/shared_thread_pool.hpp @@ -0,0 +1,9 @@ +#pragma once + +#include + +namespace mbgl { + +std::shared_ptr sharedThreadPool(); + +} // namespace mbgl diff --git a/platform/ios/config.cmake b/platform/ios/config.cmake index b37aae9f3..72e1c8852 100644 --- a/platform/ios/config.cmake +++ b/platform/ios/config.cmake @@ -58,6 +58,8 @@ macro(mbgl_platform_core) PRIVATE platform/default/mbgl/gl/offscreen_view.hpp # Thread pool + PRIVATE platform/default/mbgl/util/shared_thread_pool.cpp + PRIVATE platform/default/mbgl/util/shared_thread_pool.hpp PRIVATE platform/default/mbgl/util/default_thread_pool.cpp PRIVATE platform/default/mbgl/util/default_thread_pool.cpp ) diff --git a/platform/ios/src/MGLMapView.mm b/platform/ios/src/MGLMapView.mm index 3830b6b04..7ff327c23 100644 --- a/platform/ios/src/MGLMapView.mm +++ b/platform/ios/src/MGLMapView.mm @@ -29,6 +29,7 @@ #include #include #include +#include #import "Mapbox.h" #import "MGLFeature_Private.h" @@ -265,7 +266,7 @@ public: { mbgl::Map *_mbglMap; MBGLView *_mbglView; - mbgl::ThreadPool *_mbglThreadPool; + std::shared_ptr _mbglThreadPool; BOOL _opaque; @@ -421,7 +422,7 @@ public: // setup mbgl map mbgl::DefaultFileSource *mbglFileSource = [MGLOfflineStorage sharedOfflineStorage].mbglFileSource; const float scaleFactor = [UIScreen instancesRespondToSelector:@selector(nativeScale)] ? [[UIScreen mainScreen] nativeScale] : [[UIScreen mainScreen] scale]; - _mbglThreadPool = new mbgl::ThreadPool(4); + _mbglThreadPool = mbgl::sharedThreadPool(); _mbglMap = new mbgl::Map(*_mbglView, self.size, scaleFactor, *mbglFileSource, *_mbglThreadPool, mbgl::MapMode::Continuous, mbgl::GLContextMode::Unique, mbgl::ConstrainMode::None, mbgl::ViewportMode::Default); [self validateTileCacheSize]; @@ -687,12 +688,6 @@ public: _mbglView = nullptr; } - if (_mbglThreadPool) - { - delete _mbglThreadPool; - _mbglThreadPool = nullptr; - } - if ([[EAGLContext currentContext] isEqual:_context]) { [EAGLContext setCurrentContext:nil]; diff --git a/platform/macos/config.cmake b/platform/macos/config.cmake index 6ccec6465..309d8e82f 100644 --- a/platform/macos/config.cmake +++ b/platform/macos/config.cmake @@ -54,6 +54,8 @@ macro(mbgl_platform_core) PRIVATE platform/default/mbgl/gl/offscreen_view.hpp # Thread pool + PRIVATE platform/default/mbgl/util/shared_thread_pool.cpp + PRIVATE platform/default/mbgl/util/shared_thread_pool.hpp PRIVATE platform/default/mbgl/util/default_thread_pool.cpp PRIVATE platform/default/mbgl/util/default_thread_pool.cpp ) diff --git a/platform/macos/src/MGLMapView.mm b/platform/macos/src/MGLMapView.mm index 7776e5418..7709632d1 100644 --- a/platform/macos/src/MGLMapView.mm +++ b/platform/macos/src/MGLMapView.mm @@ -11,6 +11,7 @@ #import "MGLMultiPoint_Private.h" #import "MGLOfflineStorage_Private.h" #import "MGLStyle_Private.h" +#import "MGLFoundation_Private.h" #import "MGLAccountManager.h" #import "MGLMapCamera.h" @@ -35,6 +36,7 @@ #import #import #import +#import #import #import @@ -146,7 +148,7 @@ public: /// Cross-platform map view controller. mbgl::Map *_mbglMap; MGLMapViewImpl *_mbglView; - mbgl::ThreadPool *_mbglThreadPool; + std::shared_ptr _mbglThreadPool; NSPanGestureRecognizer *_panGestureRecognizer; NSMagnificationGestureRecognizer *_magnificationGestureRecognizer; @@ -260,7 +262,7 @@ public: mbgl::DefaultFileSource* mbglFileSource = [MGLOfflineStorage sharedOfflineStorage].mbglFileSource; - _mbglThreadPool = new mbgl::ThreadPool(4); + _mbglThreadPool = mbgl::sharedThreadPool(); _mbglMap = new mbgl::Map(*_mbglView, self.size, [NSScreen mainScreen].backingScaleFactor, *mbglFileSource, *_mbglThreadPool, mbgl::MapMode::Continuous, mbgl::GLContextMode::Unique, mbgl::ConstrainMode::None, mbgl::ViewportMode::Default); [self validateTileCacheSize]; @@ -515,10 +517,6 @@ public: delete _mbglView; _mbglView = nullptr; } - if (_mbglThreadPool) { - delete _mbglThreadPool; - _mbglThreadPool = nullptr; - } } - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(__unused NSDictionary *)change context:(void *)context { diff --git a/platform/qt/qt.cmake b/platform/qt/qt.cmake index 32ffe89bf..cee0d1080 100644 --- a/platform/qt/qt.cmake +++ b/platform/qt/qt.cmake @@ -31,8 +31,10 @@ set(MBGL_QT_FILES PRIVATE platform/default/logging_stderr.cpp # Thread pool + PRIVATE platform/default/mbgl/util/shared_thread_pool.cpp + PRIVATE platform/default/mbgl/util/shared_thread_pool.hpp PRIVATE platform/default/mbgl/util/default_thread_pool.cpp - PRIVATE platform/default/mbgl/util/default_thread_pool.cpp + PRIVATE platform/default/mbgl/util/default_thread_pool.hpp # Platform integration PRIVATE platform/qt/src/async_task.cpp diff --git a/platform/qt/src/qmapboxgl.cpp b/platform/qt/src/qmapboxgl.cpp index ca42f51eb..cf9d5f39d 100644 --- a/platform/qt/src/qmapboxgl.cpp +++ b/platform/qt/src/qmapboxgl.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #if QT_VERSION >= 0x050000 @@ -1532,10 +1533,10 @@ QMapboxGLPrivate::QMapboxGLPrivate(QMapboxGL *q, const QMapboxGLSettings &settin settings.cacheDatabasePath().toStdString(), settings.assetPath().toStdString(), settings.cacheDatabaseMaximumSize())) - , threadPool(4) + , threadPool(mbgl::sharedThreadPool()) , mapObj(std::make_unique( *this, mbgl::Size{ static_cast(size.width()), static_cast(size.height()) }, - pixelRatio, *fileSourceObj, threadPool, + pixelRatio, *fileSourceObj, *threadPool, mbgl::MapMode::Continuous, static_cast(settings.contextMode()), static_cast(settings.constrainMode()), diff --git a/platform/qt/src/qmapboxgl_p.hpp b/platform/qt/src/qmapboxgl_p.hpp index e2edf3f96..6894e0de8 100644 --- a/platform/qt/src/qmapboxgl_p.hpp +++ b/platform/qt/src/qmapboxgl_p.hpp @@ -38,7 +38,7 @@ public: QMapboxGL *q_ptr { nullptr }; std::unique_ptr fileSourceObj; - mbgl::ThreadPool threadPool; + std::shared_ptr threadPool; std::unique_ptr mapObj; bool dirty { false };