diff options
Diffstat (limited to 'src/core/hle')
| -rw-r--r-- | src/core/hle/kernel/scheduler.cpp | 2 | ||||
| -rw-r--r-- | src/core/hle/kernel/thread.cpp | 2 | ||||
| -rw-r--r-- | src/core/hle/kernel/thread.h | 5 | 
3 files changed, 8 insertions, 1 deletions
| diff --git a/src/core/hle/kernel/scheduler.cpp b/src/core/hle/kernel/scheduler.cpp index a5083ae7c..ce7e1986d 100644 --- a/src/core/hle/kernel/scheduler.cpp +++ b/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()); diff --git a/src/core/hle/kernel/thread.cpp b/src/core/hle/kernel/thread.cpp index 58b06aa9e..65fedfc9b 100644 --- a/src/core/hle/kernel/thread.cpp +++ b/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;  } diff --git a/src/core/hle/kernel/thread.h b/src/core/hle/kernel/thread.h index c08fc3a89..f651d7822 100644 --- a/src/core/hle/kernel/thread.h +++ b/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; | 
