diff options
Diffstat (limited to 'platform/default/thread_pool.cpp')
-rw-r--r-- | platform/default/thread_pool.cpp | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/platform/default/thread_pool.cpp b/platform/default/thread_pool.cpp new file mode 100644 index 0000000000..7108312c58 --- /dev/null +++ b/platform/default/thread_pool.cpp @@ -0,0 +1,55 @@ +#include <mbgl/platform/default/thread_pool.hpp> +#include <mbgl/actor/mailbox.hpp> + +namespace mbgl { + +ThreadPool::ThreadPool(std::size_t count) { + threads.reserve(count); + for (std::size_t i = 0; i < count; ++i) { + threads.emplace_back([this] () { + while (true) { + std::unique_lock<std::mutex> lock(mutex); + + cv.wait(lock, [this] { + return !queue.empty() || terminate; + }); + + if (terminate) { + return; + } + + auto mailbox = queue.front(); + queue.pop(); + lock.unlock(); + + if (auto locked = mailbox.lock()) { + locked->receive(); + } + } + }); + } +} + +ThreadPool::~ThreadPool() { + { + std::lock_guard<std::mutex> lock(mutex); + terminate = true; + } + + cv.notify_all(); + + for (auto& thread : threads) { + thread.join(); + } +} + +void ThreadPool::schedule(std::weak_ptr<Mailbox> mailbox) { + { + std::lock_guard<std::mutex> lock(mutex); + queue.push(mailbox); + } + + cv.notify_one(); +} + +} // namespace mbgl |