detached_tasks.cpp
1 // Copyright 2018 Citra Emulator Project 2 // Licensed under GPLv2 or any later version 3 // Refer to the license.txt file included. 4 5 #include <thread> 6 #include "common/assert.h" 7 #include "common/detached_tasks.h" 8 9 namespace Common { 10 11 DetachedTasks* DetachedTasks::instance = nullptr; 12 13 DetachedTasks::DetachedTasks() { 14 ASSERT(instance == nullptr); 15 instance = this; 16 } 17 18 void DetachedTasks::WaitForAllTasks() { 19 std::unique_lock lock{mutex}; 20 cv.wait(lock, [this]() { return count == 0; }); 21 } 22 23 DetachedTasks::~DetachedTasks() { 24 std::unique_lock lock{mutex}; 25 ASSERT(count == 0); 26 instance = nullptr; 27 } 28 29 void DetachedTasks::AddTask(std::function<void()> task) { 30 std::unique_lock lock{instance->mutex}; 31 ++instance->count; 32 std::thread([task{std::move(task)}]() { 33 task(); 34 std::unique_lock lock{instance->mutex}; 35 --instance->count; 36 std::notify_all_at_thread_exit(instance->cv, std::move(lock)); 37 }).detach(); 38 } 39 40 } // namespace Common