// Copyright 2015 Dolphin Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include #include #include #include #include #include "Common/Flag.h" struct EfbPokeData; class PointerWrap; class AsyncRequests { public: AsyncRequests(); void PullEvents() { if (!m_empty.IsSet()) PullEventsInternal(); } void WaitForEmptyQueue(); void SetEnable(bool enable); void SetPassthrough(bool enable); template void PushEvent(F&& callback) { std::unique_lock lock(m_mutex); if (m_passthrough) { std::invoke(callback); return; } QueueEvent(Event{std::forward(callback)}); } template auto PushBlockingEvent(F&& callback) -> std::invoke_result_t { std::unique_lock lock(m_mutex); if (m_passthrough) return std::invoke(callback); std::packaged_task task{std::forward(callback)}; QueueEvent(Event{[&] { task(); }}); lock.unlock(); return task.get_future().get(); } static AsyncRequests* GetInstance() { return &s_singleton; } private: using Event = std::function; void QueueEvent(Event&& event); void PullEventsInternal(); static AsyncRequests s_singleton; Common::Flag m_empty; std::queue m_queue; std::mutex m_mutex; std::condition_variable m_cond; bool m_enable = false; bool m_passthrough = true; };