/ src / common / detached_tasks.cpp
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