// Copyright 2018 yuzu emulator team // Licensed under GPLv2 or any later version // Refer to the license.txt file included. #pragma once #include #include #include #include #include "core/hardware_properties.h" namespace Common { class Event; class Fiber; } // namespace Common namespace Core { class System; class CpuManager { public: explicit CpuManager(System& system); CpuManager(const CpuManager&) = delete; CpuManager(CpuManager&&) = delete; ~CpuManager(); CpuManager& operator=(const CpuManager&) = delete; CpuManager& operator=(CpuManager&&) = delete; void Initialize(); void Shutdown(); void Pause(bool paused); std::function GetGuestThreadStartFunc(); std::function GetIdleThreadStartFunc(); std::function GetSuspendThreadStartFunc(); void* GetStartFuncParamater(); private: static void GuestThreadFunction(void* cpu_manager); static void IdleThreadFunction(void* cpu_manager); static void SuspendThreadFunction(void* cpu_manager); void RunGuestThread(); void RunIdleThread(); void RunSuspendThread(); static void ThreadStart(CpuManager& cpu_manager, std::size_t core); void RunThread(std::size_t core); struct CoreData { std::shared_ptr host_context; std::unique_ptr enter_barrier; std::unique_ptr exit_barrier; std::atomic is_running; std::atomic is_paused; std::atomic initialized; std::unique_ptr host_thread; }; std::atomic running_mode{}; std::atomic paused_state{}; std::array core_data{}; System& system; }; } // namespace Core