detached_tasks.cpp 1002 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  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. })
  31. .detach();
  32. }
  33. } // namespace Common