summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLiam <byteslice@airmail.cc>2022-06-18 22:54:33 +0200
committerLiam <byteslice@airmail.cc>2022-06-18 22:54:33 +0200
commit24d7aaf43c6b243f7123401545527ed7a25a3f26 (patch)
treeae068bba2c935e18d3e05557d1f581765114ad94 /src
parentMerge pull request #8476 from liamwhite/gpu-wasnt-ready (diff)
downloadyuzu-24d7aaf43c6b243f7123401545527ed7a25a3f26.tar
yuzu-24d7aaf43c6b243f7123401545527ed7a25a3f26.tar.gz
yuzu-24d7aaf43c6b243f7123401545527ed7a25a3f26.tar.bz2
yuzu-24d7aaf43c6b243f7123401545527ed7a25a3f26.tar.lz
yuzu-24d7aaf43c6b243f7123401545527ed7a25a3f26.tar.xz
yuzu-24d7aaf43c6b243f7123401545527ed7a25a3f26.tar.zst
yuzu-24d7aaf43c6b243f7123401545527ed7a25a3f26.zip
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() {
KScheduler::OnThreadStateChanged(kernel, this, old_state);
}
+void KThread::WaitUntilSuspended() {
+ // Make sure we have a suspend requested.
+ ASSERT(IsSuspendRequested());
+
+ // Loop until the thread is not executing on any core.
+ for (std::size_t i = 0; i < static_cast<std::size_t>(Core::Hardware::NUM_CPU_CORES); ++i) {
+ KThread* core_thread{};
+ do {
+ core_thread = kernel.Scheduler(i).GetCurrentThread();
+ } while (core_thread == this);
+ }
+}
+
ResultCode KThread::SetActivity(Svc::ThreadActivity activity) {
// Lock ourselves.
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:
void Continue();
+ void WaitUntilSuspended();
+
constexpr void SetSyncedIndex(s32 index) {
synced_index = index;
}
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) {
for (auto* process : GetProcessList()) {
process->SetActivity(activity);
+
+ if (should_suspend) {
+ // Wait for execution to stop
+ for (auto* thread : process->GetThreadList()) {
+ thread->WaitUntilSuspended();
+ }
+ }
}
}