Forráskód Böngészése

Thread: Release the ARM Interface on exitting.

Fernando Sahmkow 6 éve
szülő
commit
5974e3ea33

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

@@ -724,7 +724,7 @@ void Scheduler::SwitchContext() {
         previous_thread->SetContinuousOnSVC(false);
         previous_thread->last_running_ticks = system.CoreTiming().GetCPUTicks();
         previous_thread->SetIsRunning(false);
-        if (!previous_thread->IsHLEThread()) {
+        if (!previous_thread->IsHLEThread() && !previous_thread->HasExited()) {
             Core::ARM_Interface& cpu_core = previous_thread->ArmInterface();
             cpu_core.SaveContext(previous_thread->GetContext32());
             cpu_core.SaveContext(previous_thread->GetContext64());

+ 2 - 0
src/core/hle/kernel/thread.cpp

@@ -69,6 +69,8 @@ void Thread::Stop() {
             // Mark the TLS slot in the thread's page as free.
             owner_process->FreeTLSRegion(tls_address);
         }
+        arm_interface.reset();
+        has_exited = true;
     }
     global_handle = 0;
 }

+ 5 - 0
src/core/hle/kernel/thread.h

@@ -610,6 +610,10 @@ public:
         is_phantom_mode = phantom;
     }
 
+    bool HasExited() const {
+        return has_exited;
+    }
+
 private:
     friend class GlobalScheduler;
     friend class Scheduler;
@@ -714,6 +718,7 @@ private:
 
     bool will_be_terminated = false;
     bool is_phantom_mode = false;
+    bool has_exited = false;
 
     bool was_running = false;