mirror of
https://git.suyu.dev/suyu/suyu.git
synced 2024-11-15 22:54:00 +00:00
core: Run all CPU cores separately, even in single-thread mode.
This commit is contained in:
parent
fbd7afefaa
commit
edc52250b8
2 changed files with 23 additions and 13 deletions
|
@ -34,6 +34,19 @@ static void RunCpuCore(std::shared_ptr<Cpu> 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) {
|
System::ResultStatus System::RunLoop(bool tight_loop) {
|
||||||
status = ResultStatus::Success;
|
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;
|
return status;
|
||||||
}
|
}
|
||||||
|
@ -127,11 +146,6 @@ PerfStats::Results System::GetAndResetPerfStats() {
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::shared_ptr<Kernel::Scheduler>& System::Scheduler(size_t core_index) {
|
const std::shared_ptr<Kernel::Scheduler>& 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);
|
ASSERT(core_index < NUM_CPU_CORES);
|
||||||
return cpu_cores[core_index]->Scheduler();
|
return cpu_cores[core_index]->Scheduler();
|
||||||
}
|
}
|
||||||
|
|
|
@ -160,13 +160,8 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/// Returns the current CPU core based on the calling host thread
|
/// Returns the currently running CPU core
|
||||||
Cpu& CurrentCpuCore() {
|
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize the emulated system.
|
* Initialize the emulated system.
|
||||||
|
@ -184,6 +179,7 @@ private:
|
||||||
std::shared_ptr<CpuBarrier> cpu_barrier;
|
std::shared_ptr<CpuBarrier> cpu_barrier;
|
||||||
std::array<std::shared_ptr<Cpu>, NUM_CPU_CORES> cpu_cores;
|
std::array<std::shared_ptr<Cpu>, NUM_CPU_CORES> cpu_cores;
|
||||||
std::array<std::unique_ptr<std::thread>, NUM_CPU_CORES - 1> cpu_core_threads;
|
std::array<std::unique_ptr<std::thread>, NUM_CPU_CORES - 1> cpu_core_threads;
|
||||||
|
size_t active_core{}; ///< Active core, only used in single thread mode
|
||||||
|
|
||||||
/// Service manager
|
/// Service manager
|
||||||
std::shared_ptr<Service::SM::ServiceManager> service_manager;
|
std::shared_ptr<Service::SM::ServiceManager> service_manager;
|
||||||
|
|
Loading…
Reference in a new issue