1#include "../include/detail/worker_pool.hpp"
9worker_pool::~worker_pool() {
13int worker_pool::thread_count()
const {
14 return worker_thread_count;
17size_t worker_pool::size()
const {
18 std::lock_guard<std::mutex> lock(mutex);
19 return task_queue.size();
22void worker_pool::enqueue_task(task_type type, task_function&& task,
task_tag tag) {
23 bool should_wake_thread;
25 std::lock_guard<std::mutex> lock(mutex);
26 bool has_new_background_task = task_queue.push(type, std::move(task), tag);
27 should_wake_thread = has_new_background_task && idle_threads;
29 if (should_wake_thread) {
30 task_condition_variable.notify_one();
34std::list<task_function> worker_pool::pop_main_loop_tasks() {
35 std::lock_guard<std::mutex> lock(mutex);
36 return task_queue.pop_main_loop_tasks();
39void worker_pool::clear() {
40 std::lock_guard<std::mutex> lock(mutex);
44void worker_pool::shutdown() {
45 if (worker_threads.empty()) {
50 std::lock_guard<std::mutex> lock(mutex);
51 is_shutting_down =
true;
53 for (
int i = 0; i < thread_count(); i++) {
54 task_condition_variable.notify_one();
56 for (
auto& thread : worker_threads) {
57 if (thread.joinable()) {
61 worker_threads.clear();
63 is_shutting_down =
false;
66void worker_pool::wait()
const {
67 std::unique_lock<std::mutex> lock(mutex);
68 all_done_condition_variable.wait(lock, wait_predicate());
71void worker_pool::run_task_loop() {
76 std::unique_lock<std::mutex> lock(mutex);
77 if (!task_queue.try_pop(task)) {
79 assert(idle_threads <= worker_thread_count);
80 if (idle_threads == worker_thread_count) {
81 all_done_condition_variable.notify_all();
83 task_condition_variable.wait(lock, [
this, &task]{
return is_shutting_down || task_queue.try_pop(task); });
85 assert(idle_threads >= 0);
87 if (is_shutting_down) {
Definition when_all.hpp:12
Definition dispatch_queue.hpp:19
int task_tag
Definition task_tag.hpp:12