Procházet zdrojové kódy

core: Run all CPU cores separately, even in single-thread mode.

bunnei před 8 roky
rodič
revize
edc52250b8
2 změnil soubory, kde provedl 23 přidání a 13 odebrání
  1. 20 6
      src/core/core.cpp
  2. 3 7
      src/core/core.h

+ 20 - 6
src/core/core.cpp

@@ -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();
 }
 }

+ 3 - 7
src/core/core.h

@@ -160,13 +160,8 @@ public:
     }
     }
 
 
 private:
 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.
      * 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;