// SPDX-FileCopyrightText: 2018 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include #include namespace Common { /** * A background manager which ensures that all detached task is finished before program exits. * * Some tasks, telemetry submission for example, prefer executing asynchronously and don't care * about the result. These tasks are suitable for std::thread::detach(). However, this is unsafe if * the task is launched just before the program exits (which is a common case for telemetry), so we * need to block on these tasks on program exit. * * To make detached task safe, a single DetachedTasks object should be placed in the main(), and * call WaitForAllTasks() after all program execution but before global/static variable destruction. * Any potentially unsafe detached task should be executed via DetachedTasks::AddTask. */ class DetachedTasks { public: DetachedTasks(); ~DetachedTasks(); void WaitForAllTasks(); static void AddTask(std::function task); private: static DetachedTasks* instance; std::condition_variable cv; std::mutex mutex; int count = 0; }; } // namespace Common