Преглед изворни кода

Scheduler: Remove arm_interface lock and a few corrections.

Fernando Sahmkow пре 6 година
родитељ
комит
725bac1404
2 измењених фајлова са 3 додато и 17 уклоњено
  1. 0 10
      src/core/arm/arm_interface.h
  2. 3 7
      src/core/hle/kernel/scheduler.cpp

+ 0 - 10
src/core/arm/arm_interface.h

@@ -6,7 +6,6 @@
 
 #include <array>
 #include <vector>
-#include <mutex>
 #include "common/common_types.h"
 
 namespace Common {
@@ -165,14 +164,6 @@ public:
         std::string name;
     };
 
-    void Lock() {
-        guard.lock();
-    }
-
-    void Unlock() {
-        guard.unlock();
-    }
-
     std::vector<BacktraceEntry> GetBacktrace() const;
 
     /// fp (= r29) points to the last frame record.
@@ -187,7 +178,6 @@ protected:
     /// System context that this ARM interface is running under.
     System& system;
     CPUInterruptHandler& interrupt_handler;
-    std::mutex guard;
 };
 
 } // namespace Core

+ 3 - 7
src/core/hle/kernel/scheduler.cpp

@@ -463,9 +463,7 @@ void GlobalScheduler::AdjustSchedulingOnPriority(Thread* thread, u32 old_priorit
     }
 
     if (thread->processor_id >= 0) {
-        // TODO(Blinkhawk): compare it with current thread running on current core, instead of
-        // checking running
-        if (thread->IsRunning()) {
+        if (thread == kernel.CurrentScheduler().GetCurrentThread()) {
             SchedulePrepend(thread->current_priority, static_cast<u32>(thread->processor_id),
                             thread);
         } else {
@@ -602,8 +600,6 @@ void Scheduler::SwitchContextStep2() {
         previous_thread != nullptr ? previous_thread->GetOwnerProcess() : nullptr;
 
     if (new_thread) {
-        auto& cpu_core = system.ArmInterface(core_id);
-        cpu_core.Lock();
         ASSERT_MSG(new_thread->GetSchedulingStatus() == ThreadSchedStatus::Runnable,
                    "Thread must be runnable.");
 
@@ -615,6 +611,7 @@ void Scheduler::SwitchContextStep2() {
             system.Kernel().MakeCurrentProcess(thread_owner_process);
         }
         if (!new_thread->IsHLEThread()) {
+            auto& cpu_core = system.ArmInterface(core_id);
             cpu_core.LoadContext(new_thread->GetContext32());
             cpu_core.LoadContext(new_thread->GetContext64());
             cpu_core.SetTlsAddress(new_thread->GetTLSAddress());
@@ -646,8 +643,8 @@ void Scheduler::SwitchContext() {
 
     // Save context for previous thread
     if (previous_thread) {
-        auto& cpu_core = system.ArmInterface(core_id);
         if (!previous_thread->IsHLEThread()) {
+            auto& cpu_core = system.ArmInterface(core_id);
             cpu_core.SaveContext(previous_thread->GetContext32());
             cpu_core.SaveContext(previous_thread->GetContext64());
             // Save the TPIDR_EL0 system register in case it was modified.
@@ -659,7 +656,6 @@ void Scheduler::SwitchContext() {
         }
         previous_thread->SetIsRunning(false);
         previous_thread->context_guard.unlock();
-        cpu_core.Unlock();
     }
 
     std::shared_ptr<Common::Fiber> old_context;