From e4a1ead897575ee9222b4fc1021aaa9cc58f12c8 Mon Sep 17 00:00:00 2001
From: Fernando Sahmkow <fsahmkow27@gmail.com>
Date: Sun, 26 Jan 2020 14:07:22 -0400
Subject: Core: Refactor CpuCoreManager to CpuManager and Cpu to Core Manager.

This commit instends on better naming the new purpose of this classes.
---
 src/core/cpu_manager.cpp | 84 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 84 insertions(+)
 create mode 100644 src/core/cpu_manager.cpp

(limited to 'src/core/cpu_manager.cpp')

diff --git a/src/core/cpu_manager.cpp b/src/core/cpu_manager.cpp
new file mode 100644
index 0000000000..abc8aad9ef
--- /dev/null
+++ b/src/core/cpu_manager.cpp
@@ -0,0 +1,84 @@
+// Copyright 2018 yuzu emulator team
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include "common/assert.h"
+#include "core/arm/exclusive_monitor.h"
+#include "core/core.h"
+#include "core/core_manager.h"
+#include "core/core_timing.h"
+#include "core/cpu_manager.h"
+#include "core/gdbstub/gdbstub.h"
+#include "core/settings.h"
+
+namespace Core {
+
+CpuManager::CpuManager(System& system) : system{system} {}
+CpuManager::~CpuManager() = default;
+
+void CpuManager::Initialize() {
+
+    for (std::size_t index = 0; index < core_managers.size(); ++index) {
+        core_managers[index] = std::make_unique<CoreManager>(system, index);
+    }
+}
+
+void CpuManager::Shutdown() {
+    for (auto& cpu_core : core_managers) {
+        cpu_core.reset();
+    }
+}
+
+CoreManager& CpuManager::GetCoreManager(std::size_t index) {
+    return *core_managers.at(index);
+}
+
+const CoreManager& CpuManager::GetCoreManager(std::size_t index) const {
+    return *core_managers.at(index);
+}
+
+CoreManager& CpuManager::GetCurrentCoreManager() {
+    // Otherwise, use single-threaded mode active_core variable
+    return *core_managers[active_core];
+}
+
+const CoreManager& CpuManager::GetCurrentCoreManager() const {
+    // Otherwise, use single-threaded mode active_core variable
+    return *core_managers[active_core];
+}
+
+void CpuManager::RunLoop(bool tight_loop) {
+    if (GDBStub::IsServerEnabled()) {
+        GDBStub::HandlePacket();
+
+        // If the loop is halted and we want to step, use a tiny (1) number of instructions to
+        // execute. Otherwise, get out of the loop function.
+        if (GDBStub::GetCpuHaltFlag()) {
+            if (GDBStub::GetCpuStepFlag()) {
+                tight_loop = false;
+            } else {
+                return;
+            }
+        }
+    }
+
+    auto& core_timing = system.CoreTiming();
+    core_timing.ResetRun();
+    bool keep_running{};
+    do {
+        keep_running = false;
+        for (active_core = 0; active_core < NUM_CPU_CORES; ++active_core) {
+            core_timing.SwitchContext(active_core);
+            if (core_timing.CanCurrentContextRun()) {
+                core_managers[active_core]->RunLoop(tight_loop);
+            }
+            keep_running |= core_timing.CanCurrentContextRun();
+        }
+    } while (keep_running);
+
+    if (GDBStub::IsServerEnabled()) {
+        GDBStub::SetCpuStepFlag(false);
+    }
+}
+
+} // namespace Core
-- 
cgit v1.2.3-70-g09d2


From 2d1984c20c75e03ec79eeb3806b12efa1679b977 Mon Sep 17 00:00:00 2001
From: Fernando Sahmkow <fsahmkow27@gmail.com>
Date: Sun, 26 Jan 2020 16:14:18 -0400
Subject: System: Address Feedback

---
 src/core/arm/exclusive_monitor.cpp    |  3 ++-
 src/core/arm/exclusive_monitor.h      |  5 +++--
 src/core/core.cpp                     |  4 ++--
 src/core/core_manager.cpp             |  7 +++----
 src/core/core_manager.h               |  2 --
 src/core/cpu_manager.cpp              |  1 -
 src/core/cpu_manager.h                |  2 --
 src/core/hle/kernel/kernel.cpp        |  5 +++--
 src/core/hle/kernel/kernel.h          |  2 +-
 src/core/hle/kernel/physical_core.cpp | 11 +++++++----
 src/core/hle/kernel/physical_core.h   | 12 +++++++++---
 11 files changed, 30 insertions(+), 24 deletions(-)

(limited to 'src/core/cpu_manager.cpp')

diff --git a/src/core/arm/exclusive_monitor.cpp b/src/core/arm/exclusive_monitor.cpp
index 00e6a19d55..94570e5200 100644
--- a/src/core/arm/exclusive_monitor.cpp
+++ b/src/core/arm/exclusive_monitor.cpp
@@ -12,7 +12,8 @@ namespace Core {
 
 ExclusiveMonitor::~ExclusiveMonitor() = default;
 
-std::unique_ptr<Core::ExclusiveMonitor> MakeExclusiveMonitor(Memory::Memory& memory, std::size_t num_cores) {
+std::unique_ptr<Core::ExclusiveMonitor> MakeExclusiveMonitor(Memory::Memory& memory,
+                                                             std::size_t num_cores) {
 #ifdef ARCHITECTURE_x86_64
     return std::make_unique<Core::DynarmicExclusiveMonitor>(memory, num_cores);
 #else
diff --git a/src/core/arm/exclusive_monitor.h b/src/core/arm/exclusive_monitor.h
index 18461f2963..4ef418b90c 100644
--- a/src/core/arm/exclusive_monitor.h
+++ b/src/core/arm/exclusive_monitor.h
@@ -1,4 +1,4 @@
-// Copyright 2020 yuzu emulator team
+// Copyright 2018 yuzu emulator team
 // Licensed under GPLv2 or any later version
 // Refer to the license.txt file included.
 
@@ -28,6 +28,7 @@ public:
     virtual bool ExclusiveWrite128(std::size_t core_index, VAddr vaddr, u128 value) = 0;
 };
 
-std::unique_ptr<Core::ExclusiveMonitor> MakeExclusiveMonitor(Memory::Memory& memory, std::size_t num_cores);
+std::unique_ptr<Core::ExclusiveMonitor> MakeExclusiveMonitor(Memory::Memory& memory,
+                                                             std::size_t num_cores);
 
 } // namespace Core
diff --git a/src/core/core.cpp b/src/core/core.cpp
index c2295f69cd..c53d122be8 100644
--- a/src/core/core.cpp
+++ b/src/core/core.cpp
@@ -121,8 +121,8 @@ struct System::Impl {
     }
 
     Kernel::PhysicalCore& CurrentPhysicalCore() {
-        const auto i = cpu_manager.GetActiveCoreIndex();
-        return kernel.PhysicalCore(i);
+        const auto index = cpu_manager.GetActiveCoreIndex();
+        return kernel.PhysicalCore(index);
     }
 
     Kernel::PhysicalCore& GetPhysicalCore(std::size_t index) {
diff --git a/src/core/core_manager.cpp b/src/core/core_manager.cpp
index bb03857d5b..8eacf92dda 100644
--- a/src/core/core_manager.cpp
+++ b/src/core/core_manager.cpp
@@ -24,10 +24,9 @@
 namespace Core {
 
 CoreManager::CoreManager(System& system, std::size_t core_index)
-    : global_scheduler{system.GlobalScheduler()},
-      physical_core{system.Kernel().PhysicalCore(core_index)}, core_timing{system.CoreTiming()},
-      core_index{core_index} {
-}
+    : global_scheduler{system.GlobalScheduler()}, physical_core{system.Kernel().PhysicalCore(
+                                                      core_index)},
+      core_timing{system.CoreTiming()}, core_index{core_index} {}
 
 CoreManager::~CoreManager() = default;
 
diff --git a/src/core/core_manager.h b/src/core/core_manager.h
index 7bc9679c16..b14e723d7b 100644
--- a/src/core/core_manager.h
+++ b/src/core/core_manager.h
@@ -5,10 +5,8 @@
 #pragma once
 
 #include <atomic>
-#include <condition_variable>
 #include <cstddef>
 #include <memory>
-#include <mutex>
 #include "common/common_types.h"
 
 namespace Kernel {
diff --git a/src/core/cpu_manager.cpp b/src/core/cpu_manager.cpp
index abc8aad9ef..752534868a 100644
--- a/src/core/cpu_manager.cpp
+++ b/src/core/cpu_manager.cpp
@@ -17,7 +17,6 @@ CpuManager::CpuManager(System& system) : system{system} {}
 CpuManager::~CpuManager() = default;
 
 void CpuManager::Initialize() {
-
     for (std::size_t index = 0; index < core_managers.size(); ++index) {
         core_managers[index] = std::make_unique<CoreManager>(system, index);
     }
diff --git a/src/core/cpu_manager.h b/src/core/cpu_manager.h
index 5371d448e1..feb619e1b0 100644
--- a/src/core/cpu_manager.h
+++ b/src/core/cpu_manager.h
@@ -5,9 +5,7 @@
 #pragma once
 
 #include <array>
-#include <map>
 #include <memory>
-#include <thread>
 
 namespace Core {
 
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp
index 1986cf65c5..0cf3c8f70c 100644
--- a/src/core/hle/kernel/kernel.cpp
+++ b/src/core/hle/kernel/kernel.cpp
@@ -135,7 +135,8 @@ struct KernelCore::Impl {
     }
 
     void InitializePhysicalCores(KernelCore& kernel) {
-        exclusive_monitor = Core::MakeExclusiveMonitor(system.Memory(), global_scheduler.CpuCoresCount());
+        exclusive_monitor =
+            Core::MakeExclusiveMonitor(system.Memory(), global_scheduler.CpuCoresCount());
         for (std::size_t i = 0; i < global_scheduler.CpuCoresCount(); i++) {
             cores.emplace_back(system, kernel, i, *exclusive_monitor);
         }
@@ -284,7 +285,7 @@ void KernelCore::InvalidateAllInstructionCaches() {
 }
 
 void KernelCore::PrepareReschedule(std::size_t id) {
-    if (id >= 0 && id < impl->global_scheduler.CpuCoresCount()) {
+    if (id < impl->global_scheduler.CpuCoresCount()) {
         impl->cores[id].Stop();
     }
 }
diff --git a/src/core/hle/kernel/kernel.h b/src/core/hle/kernel/kernel.h
index 536068f74e..fccffaf3a9 100644
--- a/src/core/hle/kernel/kernel.h
+++ b/src/core/hle/kernel/kernel.h
@@ -13,7 +13,7 @@
 namespace Core {
 class ExclusiveMonitor;
 class System;
-}
+} // namespace Core
 
 namespace Core::Timing {
 class CoreTiming;
diff --git a/src/core/hle/kernel/physical_core.cpp b/src/core/hle/kernel/physical_core.cpp
index 7d84e3d282..896a1a87ad 100644
--- a/src/core/hle/kernel/physical_core.cpp
+++ b/src/core/hle/kernel/physical_core.cpp
@@ -17,18 +17,21 @@
 
 namespace Kernel {
 
-PhysicalCore::PhysicalCore(Core::System& system, KernelCore& kernel, std::size_t id, Core::ExclusiveMonitor& exclusive_monitor)
+PhysicalCore::PhysicalCore(Core::System& system, KernelCore& kernel, std::size_t id,
+                           Core::ExclusiveMonitor& exclusive_monitor)
     : core_index{id}, kernel{kernel} {
 #ifdef ARCHITECTURE_x86_64
-    arm_interface = std::make_unique<Core::ARM_Dynarmic>(system, exclusive_monitor, core_index);
+    arm_interface = std::make_shared<Core::ARM_Dynarmic>(system, exclusive_monitor, core_index);
 #else
-    arm_interface = std::make_unique<Core::ARM_Unicorn>(system);
+    arm_interface = std::make_shared<Core::ARM_Unicorn>(system);
     LOG_WARNING(Core, "CPU JIT requested, but Dynarmic not available");
 #endif
 
-    scheduler = std::make_unique<Kernel::Scheduler>(system, *arm_interface, core_index);
+    scheduler = std::make_shared<Kernel::Scheduler>(system, *arm_interface, core_index);
 }
 
+PhysicalCore::~PhysicalCore() = default;
+
 void PhysicalCore::Run() {
     arm_interface->Run();
     arm_interface->ClearExclusiveState();
diff --git a/src/core/hle/kernel/physical_core.h b/src/core/hle/kernel/physical_core.h
index a7848e030f..fbef0801fa 100644
--- a/src/core/hle/kernel/physical_core.h
+++ b/src/core/hle/kernel/physical_core.h
@@ -4,6 +4,9 @@
 
 #pragma once
 
+#include <cstddef>
+#include <memory>
+
 namespace Kernel {
 class Scheduler;
 } // namespace Kernel
@@ -18,7 +21,10 @@ namespace Kernel {
 
 class PhysicalCore {
 public:
-    PhysicalCore(Core::System& system, KernelCore& kernel, std::size_t id, Core::ExclusiveMonitor& exclusive_monitor);
+    PhysicalCore(Core::System& system, KernelCore& kernel, std::size_t id,
+                 Core::ExclusiveMonitor& exclusive_monitor);
+
+    ~PhysicalCore();
 
     /// Execute current jit state
     void Run();
@@ -61,8 +67,8 @@ public:
 private:
     std::size_t core_index;
     KernelCore& kernel;
-    std::unique_ptr<Core::ARM_Interface> arm_interface;
-    std::unique_ptr<Kernel::Scheduler> scheduler;
+    std::shared_ptr<Core::ARM_Interface> arm_interface;
+    std::shared_ptr<Kernel::Scheduler> scheduler;
 };
 
 } // namespace Kernel
-- 
cgit v1.2.3-70-g09d2