diff options
author | bunnei <bunneidev@gmail.com> | 2015-06-07 23:39:37 -0400 |
---|---|---|
committer | bunnei <bunneidev@gmail.com> | 2015-06-16 22:34:39 -0400 |
commit | 71e8822d23c030311858e6fcc8480b9c52f13f39 (patch) | |
tree | 0a5f53cbcebc2c98c7c9c224cbc1a91c1b783366 /src/core/hle/kernel/kernel.cpp | |
parent | f1ff0fbf075c1ecec600a8cdf44299a0c36929d3 (diff) |
kernel: Fix svcWaitSynch to always acquire requested wait objects.
Diffstat (limited to 'src/core/hle/kernel/kernel.cpp')
-rw-r--r-- | src/core/hle/kernel/kernel.cpp | 22 |
1 files changed, 4 insertions, 18 deletions
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp index 726e4d2ff0..20e11da164 100644 --- a/src/core/hle/kernel/kernel.cpp +++ b/src/core/hle/kernel/kernel.cpp @@ -32,27 +32,13 @@ void WaitObject::RemoveWaitingThread(Thread* thread) { waiting_threads.erase(itr); } -SharedPtr<Thread> WaitObject::WakeupNextThread() { - if (waiting_threads.empty()) - return nullptr; - - auto next_thread = std::move(waiting_threads.front()); - waiting_threads.erase(waiting_threads.begin()); - - next_thread->ReleaseWaitObject(this); - - return next_thread; -} - void WaitObject::WakeupAllWaitingThreads() { - auto waiting_threads_copy = waiting_threads; + for (auto thread : waiting_threads) + thread->ResumeFromWait(); - // We use a copy because ReleaseWaitObject will remove the thread from this object's - // waiting_threads list - for (auto thread : waiting_threads_copy) - thread->ReleaseWaitObject(this); + waiting_threads.clear(); - ASSERT_MSG(waiting_threads.empty(), "failed to awaken all waiting threads!"); + HLE::Reschedule(__func__); } HandleTable::HandleTable() { |