detached_tasks.cpp 993 B

12345678910111213141516171819202122232425262728293031323334353637383940
  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. std::unique_lock lock{mutex};
  19. ASSERT(count == 0);
  20. instance = nullptr;
  21. }
  22. void DetachedTasks::AddTask(std::function<void()> task) {
  23. std::unique_lock lock{instance->mutex};
  24. ++instance->count;
  25. std::thread([task{std::move(task)}]() {
  26. task();
  27. std::unique_lock lock{instance->mutex};
  28. --instance->count;
  29. std::notify_all_at_thread_exit(instance->cv, std::move(lock));
  30. }).detach();
  31. }
  32. } // namespace Common