diff options
| author | bunnei <bunneidev@gmail.com> | 2018-11-23 09:00:41 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-11-23 09:00:41 -0800 |
| commit | f1969ee1f361a2c516870c452901724c76987dc8 (patch) | |
| tree | bbe682d96c695e11c8528e1fc2a3daa33d7c54d0 /src/core/cpu_core_manager.h | |
| parent | 24dfb43ac692124a4dd1181d670b68dfd926b0d0 (diff) | |
| parent | 232d95b56e4d634e21bc6d496cff6b3dae32dc14 (diff) | |
Merge pull request #1777 from lioncash/core-mgr
core: Relocate CPU core management to its own class
Diffstat (limited to 'src/core/cpu_core_manager.h')
| -rw-r--r-- | src/core/cpu_core_manager.h | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/src/core/cpu_core_manager.h b/src/core/cpu_core_manager.h new file mode 100644 index 000000000..a4d70ec56 --- /dev/null +++ b/src/core/cpu_core_manager.h @@ -0,0 +1,59 @@ +// Copyright 2018 yuzu emulator team +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +#include <array> +#include <map> +#include <memory> +#include <thread> + +namespace Core { + +class Cpu; +class CpuBarrier; +class ExclusiveMonitor; +class System; + +class CpuCoreManager { +public: + CpuCoreManager(); + CpuCoreManager(const CpuCoreManager&) = delete; + CpuCoreManager(CpuCoreManager&&) = delete; + + ~CpuCoreManager(); + + CpuCoreManager& operator=(const CpuCoreManager&) = delete; + CpuCoreManager& operator=(CpuCoreManager&&) = delete; + + void Initialize(System& system); + void Shutdown(); + + Cpu& GetCore(std::size_t index); + const Cpu& GetCore(std::size_t index) const; + + Cpu& GetCurrentCore(); + const Cpu& GetCurrentCore() const; + + ExclusiveMonitor& GetExclusiveMonitor(); + const ExclusiveMonitor& GetExclusiveMonitor() const; + + void RunLoop(bool tight_loop); + + void InvalidateAllInstructionCaches(); + +private: + static constexpr std::size_t NUM_CPU_CORES = 4; + + std::unique_ptr<ExclusiveMonitor> exclusive_monitor; + std::unique_ptr<CpuBarrier> barrier; + std::array<std::unique_ptr<Cpu>, NUM_CPU_CORES> cores; + std::array<std::unique_ptr<std::thread>, NUM_CPU_CORES - 1> core_threads; + std::size_t active_core{}; ///< Active core, only used in single thread mode + + /// Map of guest threads to CPU cores + std::map<std::thread::id, Cpu*> thread_to_cpu; +}; + +} // namespace Core |
