1#include "../include/worker_pool.hpp"
3namespace dispatch_queue {
7worker_pool::~worker_pool() {
11int worker_pool::thread_count()
const {
12 return worker_threads.size();
15size_t worker_pool::size() {
16 std::lock_guard<std::mutex> lock(mutex);
17 return task_queue.size();
20void worker_pool::enqueue_task(pending_task&& task,
bool run_on_main_loop) {
22 std::lock_guard<std::mutex> lock(mutex);
23 task_queue.push(std::move(task), run_on_main_loop);
25 task_condition_variable.notify_one();
28std::deque<pending_task> worker_pool::pop_main_loop_tasks() {
29 std::lock_guard<std::mutex> lock(mutex);
30 return task_queue.pop_main_loop_tasks();
33void worker_pool::clear() {
34 std::lock_guard<std::mutex> lock(mutex);
38void worker_pool::shutdown() {
39 if (worker_threads.empty()) {
44 std::lock_guard<std::mutex> lock(mutex);
45 is_shutting_down =
true;
47 for (
int i = 0; i < thread_count(); i++) {
48 task_condition_variable.notify_one();
50 for (
auto& thread : worker_threads) {
51 if (thread.joinable()) {
55 worker_threads.clear();
56 is_shutting_down =
false;
59void worker_pool::wait() {
60 std::unique_lock<std::mutex> lock(mutex);
61 all_done_condition_variable.wait(lock, wait_predicate());
64void worker_pool::run_task_loop() {
69 std::unique_lock<std::mutex> lock(mutex);
70 task_condition_variable.wait(lock, [
this, &task]() {
return is_shutting_down || task_queue.try_pop(task); });
71 if (is_shutting_down) {
82 std::lock_guard<std::mutex> lock(mutex);
83 all_done = task_queue.empty();
86 all_done_condition_variable.notify_all();