diff options
author | Subv <subv2112@gmail.com> | 2016-12-08 16:34:53 +0100 |
---|---|---|
committer | Subv <subv2112@gmail.com> | 2016-12-09 18:23:09 +0100 |
commit | 17b29d8865ea4d96c18f7e1671bd6d0f01eab95f (patch) | |
tree | 20137ff3eed145ae36db64ccf4b54cf37384c82c /src/core/hle/kernel/kernel.cpp | |
parent | Use boost remove_erase_if instead of the erase-remove idiom (diff) | |
download | yuzu-17b29d8865ea4d96c18f7e1671bd6d0f01eab95f.tar yuzu-17b29d8865ea4d96c18f7e1671bd6d0f01eab95f.tar.gz yuzu-17b29d8865ea4d96c18f7e1671bd6d0f01eab95f.tar.bz2 yuzu-17b29d8865ea4d96c18f7e1671bd6d0f01eab95f.tar.lz yuzu-17b29d8865ea4d96c18f7e1671bd6d0f01eab95f.tar.xz yuzu-17b29d8865ea4d96c18f7e1671bd6d0f01eab95f.tar.zst yuzu-17b29d8865ea4d96c18f7e1671bd6d0f01eab95f.zip |
Diffstat (limited to 'src/core/hle/kernel/kernel.cpp')
-rw-r--r-- | src/core/hle/kernel/kernel.cpp | 14 |
1 files changed, 4 insertions, 10 deletions
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp index b8b69f9d0..653697843 100644 --- a/src/core/hle/kernel/kernel.cpp +++ b/src/core/hle/kernel/kernel.cpp @@ -34,14 +34,11 @@ void WaitObject::RemoveWaitingThread(Thread* thread) { SharedPtr<Thread> WaitObject::GetHighestPriorityReadyThread() { // Remove the threads that are ready or already running from our waitlist - boost::range::remove_erase_if(waiting_threads, [](const SharedPtr<Thread>& thread) -> bool { + boost::range::remove_erase_if(waiting_threads, [](const SharedPtr<Thread>& thread) { return thread->status == THREADSTATUS_RUNNING || thread->status == THREADSTATUS_READY; }); - if (waiting_threads.empty()) - return nullptr; - - SharedPtr<Thread> candidate = nullptr; + Thread* candidate = nullptr; s32 candidate_priority = THREADPRIO_LOWEST + 1; for (const auto& thread : waiting_threads) { @@ -52,7 +49,7 @@ SharedPtr<Thread> WaitObject::GetHighestPriorityReadyThread() { return object->ShouldWait(); }); if (ready_to_run) { - candidate = thread; + candidate = thread.get(); candidate_priority = thread->current_priority; } } @@ -61,9 +58,8 @@ SharedPtr<Thread> WaitObject::GetHighestPriorityReadyThread() { } void WaitObject::WakeupAllWaitingThreads() { - // Wake up all threads that can be awoken, in priority order while (auto thread = GetHighestPriorityReadyThread()) { - if (thread->wait_objects.empty()) { + if (!thread->IsSleepingOnWaitAll()) { Acquire(); // Set the output index of the WaitSynchronizationN call to the index of this object. if (thread->wait_set_output) { @@ -73,7 +69,6 @@ void WaitObject::WakeupAllWaitingThreads() { } else { for (auto object : thread->wait_objects) { object->Acquire(); - // Remove the thread from the object's waitlist object->RemoveWaitingThread(thread.get()); } // Note: This case doesn't update the output index of WaitSynchronizationN. @@ -81,7 +76,6 @@ void WaitObject::WakeupAllWaitingThreads() { thread->wait_objects.clear(); } - // Set the result of the call to WaitSynchronization to RESULT_SUCCESS thread->SetWaitSynchronizationResult(RESULT_SUCCESS); thread->ResumeFromWait(); // Note: Removing the thread from the object's waitlist will be done by GetHighestPriorityReadyThread |