summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/hle/kernel/k_thread.cpp13
-rw-r--r--src/core/hle/kernel/k_thread.h2
-rw-r--r--src/core/hle/kernel/kernel.cpp7
3 files changed, 22 insertions, 0 deletions
diff --git a/src/core/hle/kernel/k_thread.cpp b/src/core/hle/kernel/k_thread.cpp
index 8d48a7901..b8aed18b1 100644
--- a/src/core/hle/kernel/k_thread.cpp
+++ b/src/core/hle/kernel/k_thread.cpp
@@ -748,6 +748,19 @@ void KThread::Continue() {
748 KScheduler::OnThreadStateChanged(kernel, this, old_state); 748 KScheduler::OnThreadStateChanged(kernel, this, old_state);
749} 749}
750 750
751void KThread::WaitUntilSuspended() {
752 // Make sure we have a suspend requested.
753 ASSERT(IsSuspendRequested());
754
755 // Loop until the thread is not executing on any core.
756 for (std::size_t i = 0; i < static_cast<std::size_t>(Core::Hardware::NUM_CPU_CORES); ++i) {
757 KThread* core_thread{};
758 do {
759 core_thread = kernel.Scheduler(i).GetCurrentThread();
760 } while (core_thread == this);
761 }
762}
763
751ResultCode KThread::SetActivity(Svc::ThreadActivity activity) { 764ResultCode KThread::SetActivity(Svc::ThreadActivity activity) {
752 // Lock ourselves. 765 // Lock ourselves.
753 KScopedLightLock lk(activity_pause_lock); 766 KScopedLightLock lk(activity_pause_lock);
diff --git a/src/core/hle/kernel/k_thread.h b/src/core/hle/kernel/k_thread.h
index f4d83f99a..8c1f8a344 100644
--- a/src/core/hle/kernel/k_thread.h
+++ b/src/core/hle/kernel/k_thread.h
@@ -207,6 +207,8 @@ public:
207 207
208 void Continue(); 208 void Continue();
209 209
210 void WaitUntilSuspended();
211
210 constexpr void SetSyncedIndex(s32 index) { 212 constexpr void SetSyncedIndex(s32 index) {
211 synced_index = index; 213 synced_index = index;
212 } 214 }
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp
index 73593c7a0..7d9267ddc 100644
--- a/src/core/hle/kernel/kernel.cpp
+++ b/src/core/hle/kernel/kernel.cpp
@@ -1079,6 +1079,13 @@ void KernelCore::Suspend(bool suspended) {
1079 1079
1080 for (auto* process : GetProcessList()) { 1080 for (auto* process : GetProcessList()) {
1081 process->SetActivity(activity); 1081 process->SetActivity(activity);
1082
1083 if (should_suspend) {
1084 // Wait for execution to stop
1085 for (auto* thread : process->GetThreadList()) {
1086 thread->WaitUntilSuspended();
1087 }
1088 }
1082 } 1089 }
1083} 1090}
1084 1091