diff options
| author | 2018-10-15 08:42:06 -0400 | |
|---|---|---|
| committer | 2018-10-15 09:11:47 -0400 | |
| commit | c34efbbd60a41afbbab2ff17bbff999519cfb4b6 (patch) | |
| tree | bc6fa89e02a4c8d43b3cee93c124e3bc74b476b5 | |
| parent | Merge pull request #1486 from lioncash/file (diff) | |
| download | yuzu-c34efbbd60a41afbbab2ff17bbff999519cfb4b6.tar.gz yuzu-c34efbbd60a41afbbab2ff17bbff999519cfb4b6.tar.xz yuzu-c34efbbd60a41afbbab2ff17bbff999519cfb4b6.zip | |
core: Make CPUBarrier a unique_ptr instead of a shared_ptr
This will always outlive the Cpu instances, since it's destroyed after
we destroy the Cpu instances on shutdown, so there's no need for shared
ownership semantics here.
| -rw-r--r-- | src/core/core.cpp | 6 | ||||
| -rw-r--r-- | src/core/core_cpu.cpp | 9 | ||||
| -rw-r--r-- | src/core/core_cpu.h | 6 |
3 files changed, 10 insertions, 11 deletions
diff --git a/src/core/core.cpp b/src/core/core.cpp index 32baa40dc..1b9b1f608 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp | |||
| @@ -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_shared<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>(); |
| @@ -283,7 +283,7 @@ struct System::Impl { | |||
| 283 | std::unique_ptr<Tegra::GPU> gpu_core; | 283 | std::unique_ptr<Tegra::GPU> gpu_core; |
| 284 | std::shared_ptr<Tegra::DebugContext> debug_context; | 284 | std::shared_ptr<Tegra::DebugContext> debug_context; |
| 285 | std::shared_ptr<ExclusiveMonitor> cpu_exclusive_monitor; | 285 | std::shared_ptr<ExclusiveMonitor> cpu_exclusive_monitor; |
| 286 | std::shared_ptr<CpuBarrier> cpu_barrier; | 286 | std::unique_ptr<CpuBarrier> cpu_barrier; |
| 287 | std::array<std::shared_ptr<Cpu>, NUM_CPU_CORES> cpu_cores; | 287 | std::array<std::shared_ptr<Cpu>, NUM_CPU_CORES> cpu_cores; |
| 288 | std::array<std::unique_ptr<std::thread>, NUM_CPU_CORES - 1> cpu_core_threads; | 288 | 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 | 289 | std::size_t active_core{}; ///< Active core, only used in single thread mode |
diff --git a/src/core/core_cpu.cpp b/src/core/core_cpu.cpp index 265f8ed9c..928262c9b 100644 --- a/src/core/core_cpu.cpp +++ b/src/core/core_cpu.cpp | |||
| @@ -49,10 +49,9 @@ bool CpuBarrier::Rendezvous() { | |||
| 49 | return false; | 49 | return false; |
| 50 | } | 50 | } |
| 51 | 51 | ||
| 52 | Cpu::Cpu(std::shared_ptr<ExclusiveMonitor> exclusive_monitor, | 52 | Cpu::Cpu(std::shared_ptr<ExclusiveMonitor> exclusive_monitor, CpuBarrier& cpu_barrier, |
| 53 | std::shared_ptr<CpuBarrier> cpu_barrier, std::size_t core_index) | 53 | std::size_t core_index) |
| 54 | : cpu_barrier{std::move(cpu_barrier)}, core_index{core_index} { | 54 | : cpu_barrier{cpu_barrier}, core_index{core_index} { |
| 55 | |||
| 56 | if (Settings::values.use_cpu_jit) { | 55 | if (Settings::values.use_cpu_jit) { |
| 57 | #ifdef ARCHITECTURE_x86_64 | 56 | #ifdef ARCHITECTURE_x86_64 |
| 58 | arm_interface = std::make_unique<ARM_Dynarmic>(exclusive_monitor, core_index); | 57 | arm_interface = std::make_unique<ARM_Dynarmic>(exclusive_monitor, core_index); |
| @@ -83,7 +82,7 @@ std::shared_ptr<ExclusiveMonitor> Cpu::MakeExclusiveMonitor(std::size_t num_core | |||
| 83 | 82 | ||
| 84 | void Cpu::RunLoop(bool tight_loop) { | 83 | void Cpu::RunLoop(bool tight_loop) { |
| 85 | // Wait for all other CPU cores to complete the previous slice, such that they run in lock-step | 84 | // Wait for all other CPU cores to complete the previous slice, such that they run in lock-step |
| 86 | if (!cpu_barrier->Rendezvous()) { | 85 | if (!cpu_barrier.Rendezvous()) { |
| 87 | // If rendezvous failed, session has been killed | 86 | // If rendezvous failed, session has been killed |
| 88 | return; | 87 | return; |
| 89 | } | 88 | } |
diff --git a/src/core/core_cpu.h b/src/core/core_cpu.h index ee7e04abc..68d83ac8f 100644 --- a/src/core/core_cpu.h +++ b/src/core/core_cpu.h | |||
| @@ -41,8 +41,8 @@ private: | |||
| 41 | 41 | ||
| 42 | class Cpu { | 42 | class Cpu { |
| 43 | public: | 43 | public: |
| 44 | Cpu(std::shared_ptr<ExclusiveMonitor> exclusive_monitor, | 44 | Cpu(std::shared_ptr<ExclusiveMonitor> exclusive_monitor, CpuBarrier& cpu_barrier, |
| 45 | std::shared_ptr<CpuBarrier> cpu_barrier, std::size_t core_index); | 45 | std::size_t core_index); |
| 46 | ~Cpu(); | 46 | ~Cpu(); |
| 47 | 47 | ||
| 48 | void RunLoop(bool tight_loop = true); | 48 | void RunLoop(bool tight_loop = true); |
| @@ -77,7 +77,7 @@ private: | |||
| 77 | void Reschedule(); | 77 | void Reschedule(); |
| 78 | 78 | ||
| 79 | std::unique_ptr<ARM_Interface> arm_interface; | 79 | std::unique_ptr<ARM_Interface> arm_interface; |
| 80 | std::shared_ptr<CpuBarrier> cpu_barrier; | 80 | CpuBarrier& cpu_barrier; |
| 81 | std::shared_ptr<Kernel::Scheduler> scheduler; | 81 | std::shared_ptr<Kernel::Scheduler> scheduler; |
| 82 | 82 | ||
| 83 | std::atomic<bool> reschedule_pending = false; | 83 | std::atomic<bool> reschedule_pending = false; |