diff options
Diffstat (limited to 'src/core/core.cpp')
| -rw-r--r-- | src/core/core.cpp | 41 |
1 files changed, 25 insertions, 16 deletions
diff --git a/src/core/core.cpp b/src/core/core.cpp index 32baa40dc..3c57a62ec 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp | |||
| @@ -71,9 +71,9 @@ FileSys::VirtualFile GetGameFileFromPath(const FileSys::VirtualFilesystem& vfs, | |||
| 71 | } | 71 | } |
| 72 | 72 | ||
| 73 | /// Runs a CPU core while the system is powered on | 73 | /// Runs a CPU core while the system is powered on |
| 74 | void RunCpuCore(std::shared_ptr<Cpu> cpu_state) { | 74 | void RunCpuCore(Cpu& cpu_state) { |
| 75 | while (Core::System::GetInstance().IsPoweredOn()) { | 75 | while (Core::System::GetInstance().IsPoweredOn()) { |
| 76 | cpu_state->RunLoop(true); | 76 | cpu_state.RunLoop(true); |
| 77 | } | 77 | } |
| 78 | } | 78 | } |
| 79 | } // Anonymous namespace | 79 | } // Anonymous namespace |
| @@ -95,7 +95,7 @@ struct System::Impl { | |||
| 95 | status = ResultStatus::Success; | 95 | status = ResultStatus::Success; |
| 96 | 96 | ||
| 97 | // Update thread_to_cpu in case Core 0 is run from a different host thread | 97 | // Update thread_to_cpu in case Core 0 is run from a different host thread |
| 98 | thread_to_cpu[std::this_thread::get_id()] = cpu_cores[0]; | 98 | thread_to_cpu[std::this_thread::get_id()] = cpu_cores[0].get(); |
| 99 | 99 | ||
| 100 | if (GDBStub::IsServerEnabled()) { | 100 | if (GDBStub::IsServerEnabled()) { |
| 101 | GDBStub::HandlePacket(); | 101 | GDBStub::HandlePacket(); |
| @@ -139,10 +139,10 @@ struct System::Impl { | |||
| 139 | auto main_process = Kernel::Process::Create(kernel, "main"); | 139 | auto main_process = Kernel::Process::Create(kernel, "main"); |
| 140 | kernel.MakeCurrentProcess(main_process.get()); | 140 | kernel.MakeCurrentProcess(main_process.get()); |
| 141 | 141 | ||
| 142 | cpu_barrier = std::make_shared<CpuBarrier>(); | 142 | cpu_barrier = std::make_unique<CpuBarrier>(); |
| 143 | cpu_exclusive_monitor = Cpu::MakeExclusiveMonitor(cpu_cores.size()); | 143 | cpu_exclusive_monitor = Cpu::MakeExclusiveMonitor(cpu_cores.size()); |
| 144 | for (std::size_t index = 0; index < cpu_cores.size(); ++index) { | 144 | for (std::size_t index = 0; index < cpu_cores.size(); ++index) { |
| 145 | cpu_cores[index] = std::make_shared<Cpu>(cpu_exclusive_monitor, cpu_barrier, index); | 145 | cpu_cores[index] = std::make_unique<Cpu>(*cpu_exclusive_monitor, *cpu_barrier, index); |
| 146 | } | 146 | } |
| 147 | 147 | ||
| 148 | telemetry_session = std::make_unique<Core::TelemetrySession>(); | 148 | telemetry_session = std::make_unique<Core::TelemetrySession>(); |
| @@ -160,12 +160,12 @@ struct System::Impl { | |||
| 160 | 160 | ||
| 161 | // Create threads for CPU cores 1-3, and build thread_to_cpu map | 161 | // Create threads for CPU cores 1-3, and build thread_to_cpu map |
| 162 | // CPU core 0 is run on the main thread | 162 | // CPU core 0 is run on the main thread |
| 163 | thread_to_cpu[std::this_thread::get_id()] = cpu_cores[0]; | 163 | thread_to_cpu[std::this_thread::get_id()] = cpu_cores[0].get(); |
| 164 | if (Settings::values.use_multi_core) { | 164 | if (Settings::values.use_multi_core) { |
| 165 | for (std::size_t index = 0; index < cpu_core_threads.size(); ++index) { | 165 | for (std::size_t index = 0; index < cpu_core_threads.size(); ++index) { |
| 166 | cpu_core_threads[index] = | 166 | cpu_core_threads[index] = |
| 167 | std::make_unique<std::thread>(RunCpuCore, cpu_cores[index + 1]); | 167 | std::make_unique<std::thread>(RunCpuCore, std::ref(*cpu_cores[index + 1])); |
| 168 | thread_to_cpu[cpu_core_threads[index]->get_id()] = cpu_cores[index + 1]; | 168 | thread_to_cpu[cpu_core_threads[index]->get_id()] = cpu_cores[index + 1].get(); |
| 169 | } | 169 | } |
| 170 | } | 170 | } |
| 171 | 171 | ||
| @@ -245,6 +245,7 @@ struct System::Impl { | |||
| 245 | for (auto& cpu_core : cpu_cores) { | 245 | for (auto& cpu_core : cpu_cores) { |
| 246 | cpu_core.reset(); | 246 | cpu_core.reset(); |
| 247 | } | 247 | } |
| 248 | cpu_exclusive_monitor.reset(); | ||
| 248 | cpu_barrier.reset(); | 249 | cpu_barrier.reset(); |
| 249 | 250 | ||
| 250 | // Shutdown kernel and core timing | 251 | // Shutdown kernel and core timing |
| @@ -282,9 +283,9 @@ struct System::Impl { | |||
| 282 | std::unique_ptr<VideoCore::RendererBase> renderer; | 283 | std::unique_ptr<VideoCore::RendererBase> renderer; |
| 283 | std::unique_ptr<Tegra::GPU> gpu_core; | 284 | std::unique_ptr<Tegra::GPU> gpu_core; |
| 284 | std::shared_ptr<Tegra::DebugContext> debug_context; | 285 | std::shared_ptr<Tegra::DebugContext> debug_context; |
| 285 | std::shared_ptr<ExclusiveMonitor> cpu_exclusive_monitor; | 286 | std::unique_ptr<ExclusiveMonitor> cpu_exclusive_monitor; |
| 286 | std::shared_ptr<CpuBarrier> cpu_barrier; | 287 | std::unique_ptr<CpuBarrier> cpu_barrier; |
| 287 | std::array<std::shared_ptr<Cpu>, NUM_CPU_CORES> cpu_cores; | 288 | std::array<std::unique_ptr<Cpu>, NUM_CPU_CORES> cpu_cores; |
| 288 | std::array<std::unique_ptr<std::thread>, NUM_CPU_CORES - 1> cpu_core_threads; | 289 | std::array<std::unique_ptr<std::thread>, NUM_CPU_CORES - 1> cpu_core_threads; |
| 289 | std::size_t active_core{}; ///< Active core, only used in single thread mode | 290 | std::size_t active_core{}; ///< Active core, only used in single thread mode |
| 290 | 291 | ||
| @@ -298,7 +299,7 @@ struct System::Impl { | |||
| 298 | std::string status_details = ""; | 299 | std::string status_details = ""; |
| 299 | 300 | ||
| 300 | /// Map of guest threads to CPU cores | 301 | /// Map of guest threads to CPU cores |
| 301 | std::map<std::thread::id, std::shared_ptr<Cpu>> thread_to_cpu; | 302 | std::map<std::thread::id, Cpu*> thread_to_cpu; |
| 302 | 303 | ||
| 303 | Core::PerfStats perf_stats; | 304 | Core::PerfStats perf_stats; |
| 304 | Core::FrameLimiter frame_limiter; | 305 | Core::FrameLimiter frame_limiter; |
| @@ -354,12 +355,15 @@ std::size_t System::CurrentCoreIndex() { | |||
| 354 | } | 355 | } |
| 355 | 356 | ||
| 356 | Kernel::Scheduler& System::CurrentScheduler() { | 357 | Kernel::Scheduler& System::CurrentScheduler() { |
| 357 | return *CurrentCpuCore().Scheduler(); | 358 | return CurrentCpuCore().Scheduler(); |
| 358 | } | 359 | } |
| 359 | 360 | ||
| 360 | const std::shared_ptr<Kernel::Scheduler>& System::Scheduler(std::size_t core_index) { | 361 | Kernel::Scheduler& System::Scheduler(std::size_t core_index) { |
| 361 | ASSERT(core_index < NUM_CPU_CORES); | 362 | return CpuCore(core_index).Scheduler(); |
| 362 | return impl->cpu_cores[core_index]->Scheduler(); | 363 | } |
| 364 | |||
| 365 | const Kernel::Scheduler& System::Scheduler(std::size_t core_index) const { | ||
| 366 | return CpuCore(core_index).Scheduler(); | ||
| 363 | } | 367 | } |
| 364 | 368 | ||
| 365 | Kernel::Process* System::CurrentProcess() { | 369 | Kernel::Process* System::CurrentProcess() { |
| @@ -380,6 +384,11 @@ Cpu& System::CpuCore(std::size_t core_index) { | |||
| 380 | return *impl->cpu_cores[core_index]; | 384 | return *impl->cpu_cores[core_index]; |
| 381 | } | 385 | } |
| 382 | 386 | ||
| 387 | const Cpu& System::CpuCore(std::size_t core_index) const { | ||
| 388 | ASSERT(core_index < NUM_CPU_CORES); | ||
| 389 | return *impl->cpu_cores[core_index]; | ||
| 390 | } | ||
| 391 | |||
| 383 | ExclusiveMonitor& System::Monitor() { | 392 | ExclusiveMonitor& System::Monitor() { |
| 384 | return *impl->cpu_exclusive_monitor; | 393 | return *impl->cpu_exclusive_monitor; |
| 385 | } | 394 | } |