| |
| |
|
|
| #pragma once |
|
|
| #include <array> |
| #include <atomic> |
| #include <functional> |
| #include <memory> |
| #include <thread> |
|
|
| #include "common/fiber.h" |
| #include "common/polyfill_thread.h" |
| #include "common/thread.h" |
| #include "core/hardware_properties.h" |
|
|
| namespace Common { |
| class Event; |
| class Fiber; |
| } |
|
|
| 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 SetMulticore(bool is_multi) { |
| is_multicore = is_multi; |
| } |
|
|
| |
| void SetAsyncGpu(bool is_async) { |
| is_async_gpu = is_async; |
| } |
|
|
| void OnGpuReady() { |
| gpu_barrier->Sync(); |
| } |
|
|
| void Initialize(); |
| void Shutdown(); |
|
|
| std::function<void()> GetGuestActivateFunc() { |
| return [this] { GuestActivate(); }; |
| } |
| std::function<void()> GetGuestThreadFunc() { |
| return [this] { GuestThreadFunction(); }; |
| } |
| std::function<void()> GetIdleThreadStartFunc() { |
| return [this] { IdleThreadFunction(); }; |
| } |
| std::function<void()> GetShutdownThreadStartFunc() { |
| return [this] { ShutdownThreadFunction(); }; |
| } |
|
|
| void PreemptSingleCore(bool from_running_environment = true); |
|
|
| std::size_t CurrentCore() const { |
| return current_core.load(); |
| } |
|
|
| private: |
| void GuestThreadFunction(); |
| void IdleThreadFunction(); |
| void ShutdownThreadFunction(); |
|
|
| void MultiCoreRunGuestThread(); |
| void MultiCoreRunIdleThread(); |
|
|
| void SingleCoreRunGuestThread(); |
| void SingleCoreRunIdleThread(); |
|
|
| void GuestActivate(); |
| void HandleInterrupt(); |
| void ShutdownThread(); |
| void RunThread(std::stop_token stop_token, std::size_t core); |
|
|
| struct CoreData { |
| std::shared_ptr<Common::Fiber> host_context; |
| std::jthread host_thread; |
| }; |
|
|
| std::unique_ptr<Common::Barrier> gpu_barrier{}; |
| std::array<CoreData, Core::Hardware::NUM_CPU_CORES> core_data{}; |
|
|
| bool is_async_gpu{}; |
| bool is_multicore{}; |
| std::atomic<std::size_t> current_core{}; |
| std::size_t idle_count{}; |
| std::size_t num_cores{}; |
| static constexpr std::size_t max_cycle_runs = 5; |
|
|
| System& system; |
| }; |
|
|
| } |
|
|