Просмотр исходного кода

threading: Reschedule only on cores that are necessary.

bunnei 8 лет назад
Родитель
Сommit
8aa5d25f82
4 измененных файлов с 10 добавлено и 3 удалено
  1. 5 0
      src/core/core.cpp
  2. 2 0
      src/core/core.h
  3. 2 2
      src/core/hle/kernel/svc.cpp
  4. 1 1
      src/core/hle/kernel/thread.cpp

+ 5 - 0
src/core/core.cpp

@@ -141,6 +141,11 @@ ARM_Interface& System::ArmInterface(size_t core_index) {
     return cpu_cores[core_index]->ArmInterface();
 }
 
+Cpu& System::CpuCore(size_t core_index) {
+    ASSERT(core_index < NUM_CPU_CORES);
+    return *cpu_cores[core_index];
+}
+
 System::ResultStatus System::Init(EmuWindow* emu_window, u32 system_mode) {
     NGLOG_DEBUG(HW_Memory, "initialized OK");
 

+ 2 - 0
src/core/core.h

@@ -114,6 +114,8 @@ public:
 
     ARM_Interface& ArmInterface(size_t core_index);
 
+    Cpu& CpuCore(size_t core_index);
+
     Tegra::GPU& GPU() {
         return *gpu_core;
     }

+ 2 - 2
src/core/hle/kernel/svc.cpp

@@ -625,7 +625,7 @@ static ResultCode WaitProcessWideKeyAtomic(VAddr mutex_addr, VAddr condition_var
 
     // Note: Deliberately don't attempt to inherit the lock owner's priority.
 
-    Core::System::GetInstance().PrepareReschedule();
+    Core::System::GetInstance().CpuCore(current_thread->processor_id).PrepareReschedule();
     return RESULT_SUCCESS;
 }
 
@@ -678,7 +678,7 @@ static ResultCode SignalProcessWideKey(VAddr condition_variable_addr, s32 target
 
                 owner->AddMutexWaiter(thread);
 
-                Core::System::GetInstance().PrepareReschedule();
+                Core::System::GetInstance().CpuCore(thread->processor_id).PrepareReschedule();
             }
 
             ++processed;

+ 1 - 1
src/core/hle/kernel/thread.cpp

@@ -189,7 +189,7 @@ void Thread::ResumeFromWait() {
 
     status = THREADSTATUS_READY;
     scheduler->ScheduleThread(this, current_priority);
-    Core::System::GetInstance().PrepareReschedule();
+    Core::System::GetInstance().CpuCore(processor_id).PrepareReschedule();
 }
 
 /**