summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/hle/kernel/scheduler.cpp2
-rw-r--r--src/core/hle/kernel/thread.cpp2
-rw-r--r--src/core/hle/kernel/thread.h5
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;