From edc52250b8157a9d2b8c909225114c98c7ea609e Mon Sep 17 00:00:00 2001 From: bunnei Date: Mon, 7 May 2018 22:57:39 -0400 Subject: core: Run all CPU cores separately, even in single-thread mode. --- src/core/core.cpp | 26 ++++++++++++++++++++------ src/core/core.h | 10 +++------- 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/src/core/core.cpp b/src/core/core.cpp index 6cbfc3035..84ab876cc 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -34,6 +34,19 @@ static void RunCpuCore(std::shared_ptr cpu_state) { } } +Cpu& System::CurrentCpuCore() { + // If multicore is enabled, use host thread to figure out the current CPU core + if (Settings::values.use_multi_core) { + const auto& search = thread_to_cpu.find(std::this_thread::get_id()); + ASSERT(search != thread_to_cpu.end()); + ASSERT(search->second); + return *search->second; + } + + // Otherwise, use single-threaded mode active_core variable + return *cpu_cores[active_core]; +} + System::ResultStatus System::RunLoop(bool tight_loop) { status = ResultStatus::Success; @@ -55,7 +68,13 @@ System::ResultStatus System::RunLoop(bool tight_loop) { } } - cpu_cores[0]->RunLoop(tight_loop); + for (active_core = 0; active_core < NUM_CPU_CORES; ++active_core) { + cpu_cores[active_core]->RunLoop(tight_loop); + if (Settings::values.use_multi_core) { + // Cores 1-3 are run on other threads in this mode + break; + } + } return status; } @@ -127,11 +146,6 @@ PerfStats::Results System::GetAndResetPerfStats() { } const std::shared_ptr& System::Scheduler(size_t core_index) { - if (!Settings::values.use_multi_core) { - // Always use Core 0 scheduler when multicore is disabled - return cpu_cores[0]->Scheduler(); - } - ASSERT(core_index < NUM_CPU_CORES); return cpu_cores[core_index]->Scheduler(); } diff --git a/src/core/core.h b/src/core/core.h index 5740e858b..6de707271 100644 --- a/src/core/core.h +++ b/src/core/core.h @@ -160,13 +160,8 @@ public: } private: - /// Returns the current CPU core based on the calling host thread - Cpu& CurrentCpuCore() { - const auto& search = thread_to_cpu.find(std::this_thread::get_id()); - ASSERT(search != thread_to_cpu.end()); - ASSERT(search->second); - return *search->second; - } + /// Returns the currently running CPU core + Cpu& CurrentCpuCore(); /** * Initialize the emulated system. @@ -184,6 +179,7 @@ private: std::shared_ptr cpu_barrier; std::array, NUM_CPU_CORES> cpu_cores; std::array, NUM_CPU_CORES - 1> cpu_core_threads; + size_t active_core{}; ///< Active core, only used in single thread mode /// Service manager std::shared_ptr service_manager; -- cgit v1.2.3