summaryrefslogtreecommitdiff
path: root/src/mbgl/util/thread_pool.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mbgl/util/thread_pool.cpp')
-rw-r--r--src/mbgl/util/thread_pool.cpp62
1 files changed, 27 insertions, 35 deletions
diff --git a/src/mbgl/util/thread_pool.cpp b/src/mbgl/util/thread_pool.cpp
index d8df0cd575..040e996dd4 100644
--- a/src/mbgl/util/thread_pool.cpp
+++ b/src/mbgl/util/thread_pool.cpp
@@ -6,49 +6,41 @@
namespace mbgl {
-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));
- platform::attachThread();
-
- while (true) {
- std::unique_lock<std::mutex> lock(mutex);
-
- cv.wait(lock, [this] {
- return !queue.empty() || terminate;
- });
-
- if (terminate) {
- platform::detachThread();
- return;
- }
-
- auto function = std::move(queue.front());
- queue.pop();
- lock.unlock();
- if (function) function();
- }
- });
- }
-}
+ThreadedSchedulerBase::~ThreadedSchedulerBase() = default;
-ThreadPool::~ThreadPool() {
+void ThreadedSchedulerBase::terminate() {
{
std::lock_guard<std::mutex> lock(mutex);
- terminate = true;
+ terminated = true;
}
-
cv.notify_all();
+}
- for (auto& thread : threads) {
- thread.join();
- }
+std::thread ThreadedSchedulerBase::makeSchedulerThread(size_t index) {
+ return std::thread([this, index]() {
+ platform::setCurrentThreadName(std::string{"Worker "} + util::toString(index + 1));
+ platform::attachThread();
+
+ while (true) {
+ std::unique_lock<std::mutex> lock(mutex);
+
+ cv.wait(lock, [this] { return !queue.empty() || terminated; });
+
+ if (terminated) {
+ platform::detachThread();
+ return;
+ }
+
+ auto function = std::move(queue.front());
+ queue.pop();
+ lock.unlock();
+ if (function) function();
+ }
+ });
}
-void ThreadPool::schedule(std::function<void()> fn) {
+void ThreadedSchedulerBase::schedule(std::function<void()> fn) {
+ assert(fn);
{
std::lock_guard<std::mutex> lock(mutex);
queue.push(std::move(fn));