| |
| |
|
|
| #include <thread> |
| #include "common/assert.h" |
| #include "common/detached_tasks.h" |
|
|
| namespace Common { |
|
|
| DetachedTasks* DetachedTasks::instance = nullptr; |
|
|
| DetachedTasks::DetachedTasks() { |
| ASSERT(instance == nullptr); |
| instance = this; |
| } |
|
|
| void DetachedTasks::WaitForAllTasks() { |
| std::unique_lock lock{mutex}; |
| cv.wait(lock, [this]() { return count == 0; }); |
| } |
|
|
| DetachedTasks::~DetachedTasks() { |
| WaitForAllTasks(); |
|
|
| std::unique_lock lock{mutex}; |
| ASSERT(count == 0); |
| instance = nullptr; |
| } |
|
|
| void DetachedTasks::AddTask(std::function<void()> task) { |
| std::unique_lock lock{instance->mutex}; |
| ++instance->count; |
| std::thread([task_{std::move(task)}]() { |
| task_(); |
| std::unique_lock thread_lock{instance->mutex}; |
| --instance->count; |
| std::notify_all_at_thread_exit(instance->cv, std::move(thread_lock)); |
| }).detach(); |
| } |
|
|
| } |
|
|