From 5954eea345677682479ad5df4d6b059737efd7f0 Mon Sep 17 00:00:00 2001 From: "Thiago Marcos P. Santos" Date: Tue, 5 Mar 2019 01:57:25 +0200 Subject: [core] Move ThreadPool to core It is the same used by all the platforms. --- platform/android/core-files.json | 1 - platform/default/src/mbgl/platform/thread_pool.cpp | 83 ---------------------- platform/ios/core-files.json | 1 - platform/linux/config.cmake | 3 - platform/macos/core-files.json | 1 - platform/qt/qt.cmake | 3 - src/core-files.json | 1 + src/mbgl/util/thread_pool.cpp | 83 ++++++++++++++++++++++ 8 files changed, 84 insertions(+), 92 deletions(-) delete mode 100644 platform/default/src/mbgl/platform/thread_pool.cpp create mode 100644 src/mbgl/util/thread_pool.cpp diff --git a/platform/android/core-files.json b/platform/android/core-files.json index 78764e99bc..ba56695bdd 100644 --- a/platform/android/core-files.json +++ b/platform/android/core-files.json @@ -88,7 +88,6 @@ "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/platform/thread_pool.cpp", "platform/default/src/mbgl/text/bidi.cpp", "platform/default/src/mbgl/util/png_writer.cpp", "platform/default/src/mbgl/util/thread_local.cpp", diff --git a/platform/default/src/mbgl/platform/thread_pool.cpp b/platform/default/src/mbgl/platform/thread_pool.cpp deleted file mode 100644 index d213aab71c..0000000000 --- a/platform/default/src/mbgl/platform/thread_pool.cpp +++ /dev/null @@ -1,83 +0,0 @@ -#include -#include -#include -#include - -#include -#include -#include -#include - -namespace mbgl { - -class ThreadPool final : public Scheduler { -public: - explicit ThreadPool(std::size_t count); - ~ThreadPool() override; - - void schedule(std::weak_ptr) override; - -private: - std::vector threads; - std::queue> queue; - std::mutex mutex; - std::condition_variable cv; - bool terminate { false }; -}; - -ThreadPool::ThreadPool(std::size_t count) { - 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)); - - while (true) { - std::unique_lock lock(mutex); - - cv.wait(lock, [this] { - return !queue.empty() || terminate; - }); - - if (terminate) { - return; - } - - auto mailbox = queue.front(); - queue.pop(); - lock.unlock(); - - Mailbox::maybeReceive(mailbox); - } - }); - } -} - -ThreadPool::~ThreadPool() { - { - std::lock_guard lock(mutex); - terminate = true; - } - - cv.notify_all(); - - for (auto& thread : threads) { - thread.join(); - } -} - -void ThreadPool::schedule(std::weak_ptr mailbox) { - { - std::lock_guard lock(mutex); - queue.push(mailbox); - } - - cv.notify_one(); -} - -Scheduler& Scheduler::GetBackground() { - static std::unique_ptr pool(new ThreadPool(4)); - return *pool; -} - -} // namespace mbgl diff --git a/platform/ios/core-files.json b/platform/ios/core-files.json index 26a7857dd2..98833b0c94 100644 --- a/platform/ios/core-files.json +++ b/platform/ios/core-files.json @@ -13,7 +13,6 @@ "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/platform/thread_pool.cpp", "platform/default/src/mbgl/text/bidi.cpp", "platform/default/src/mbgl/util/png_writer.cpp", "platform/default/src/mbgl/util/thread_local.cpp", diff --git a/platform/linux/config.cmake b/platform/linux/config.cmake index ef987533d8..7f8b382571 100644 --- a/platform/linux/config.cmake +++ b/platform/linux/config.cmake @@ -72,9 +72,6 @@ macro(mbgl_platform_core) # Snapshotting PRIVATE platform/default/src/mbgl/map/map_snapshotter.cpp PRIVATE platform/default/include/mbgl/map/map_snapshotter.hpp - - # Thread pool - PRIVATE platform/default/src/mbgl/platform/thread_pool.cpp ) target_include_directories(mbgl-core diff --git a/platform/macos/core-files.json b/platform/macos/core-files.json index eb9357bedb..abeda5796b 100644 --- a/platform/macos/core-files.json +++ b/platform/macos/core-files.json @@ -12,7 +12,6 @@ "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/platform/thread_pool.cpp", "platform/default/src/mbgl/text/bidi.cpp", "platform/default/src/mbgl/util/png_writer.cpp", "platform/default/src/mbgl/util/thread_local.cpp", diff --git a/platform/qt/qt.cmake b/platform/qt/qt.cmake index 2751ad1fad..1d0bb3d29c 100644 --- a/platform/qt/qt.cmake +++ b/platform/qt/qt.cmake @@ -17,9 +17,6 @@ set(MBGL_QT_CORE_FILES PRIVATE platform/default/include/mbgl/gl/headless_backend.hpp PRIVATE platform/qt/src/headless_backend_qt.cpp - # Thread pool - PRIVATE platform/default/src/mbgl/platform/thread_pool.cpp - # Thread PRIVATE platform/qt/src/thread_local.cpp diff --git a/src/core-files.json b/src/core-files.json index 4521457bb1..dbca83c029 100644 --- a/src/core-files.json +++ b/src/core-files.json @@ -297,6 +297,7 @@ "src/mbgl/util/rapidjson.cpp", "src/mbgl/util/stopwatch.cpp", "src/mbgl/util/string.cpp", + "src/mbgl/util/thread_pool.cpp", "src/mbgl/util/tile_cover.cpp", "src/mbgl/util/tile_cover_impl.cpp", "src/mbgl/util/tiny_sdf.cpp", diff --git a/src/mbgl/util/thread_pool.cpp b/src/mbgl/util/thread_pool.cpp new file mode 100644 index 0000000000..d213aab71c --- /dev/null +++ b/src/mbgl/util/thread_pool.cpp @@ -0,0 +1,83 @@ +#include +#include +#include +#include + +#include +#include +#include +#include + +namespace mbgl { + +class ThreadPool final : public Scheduler { +public: + explicit ThreadPool(std::size_t count); + ~ThreadPool() override; + + void schedule(std::weak_ptr) override; + +private: + std::vector threads; + std::queue> queue; + std::mutex mutex; + std::condition_variable cv; + bool terminate { false }; +}; + +ThreadPool::ThreadPool(std::size_t count) { + 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)); + + while (true) { + std::unique_lock lock(mutex); + + cv.wait(lock, [this] { + return !queue.empty() || terminate; + }); + + if (terminate) { + return; + } + + auto mailbox = queue.front(); + queue.pop(); + lock.unlock(); + + Mailbox::maybeReceive(mailbox); + } + }); + } +} + +ThreadPool::~ThreadPool() { + { + std::lock_guard lock(mutex); + terminate = true; + } + + cv.notify_all(); + + for (auto& thread : threads) { + thread.join(); + } +} + +void ThreadPool::schedule(std::weak_ptr mailbox) { + { + std::lock_guard lock(mutex); + queue.push(mailbox); + } + + cv.notify_one(); +} + +Scheduler& Scheduler::GetBackground() { + static std::unique_ptr pool(new ThreadPool(4)); + return *pool; +} + +} // namespace mbgl -- cgit v1.2.1