detached_tasks.cpp 1017 B

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