Browse Source
Merge pull request #8483 from liamwhite/fire-emblem-three-semaphores
kernel: wait for threads to stop on pause
pull/15/merge
bunnei
4 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with
22 additions and
0 deletions
-
src/core/hle/kernel/k_thread.cpp
-
src/core/hle/kernel/k_thread.h
-
src/core/hle/kernel/kernel.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); |
|
|
|
|
|
|
|
@ -207,6 +207,8 @@ public: |
|
|
|
|
|
|
|
void Continue(); |
|
|
|
|
|
|
|
void WaitUntilSuspended(); |
|
|
|
|
|
|
|
constexpr void SetSyncedIndex(s32 index) { |
|
|
|
synced_index = index; |
|
|
|
} |
|
|
|
|
|
|
|
@ -1078,6 +1078,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(); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|