diff options
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/hle/kernel/kernel.cpp | 27 |
1 files changed, 13 insertions, 14 deletions
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp index 6d358def7..07f420099 100644 --- a/src/core/hle/kernel/kernel.cpp +++ b/src/core/hle/kernel/kernel.cpp @@ -40,24 +40,23 @@ SharedPtr<Thread> WaitObject::GetHighestPriorityReadyThread() { if (waiting_threads.empty()) return nullptr; - auto candidate_threads = waiting_threads; + SharedPtr<Thread> candidate = nullptr; + s32 candidate_priority = THREADPRIO_LOWEST + 1; - // Eliminate all threads that are waiting on more than one object, and not all of said objects are ready - candidate_threads.erase(std::remove_if(candidate_threads.begin(), candidate_threads.end(), [](const SharedPtr<Thread>& thread) -> bool { - return std::any_of(thread->wait_objects.begin(), thread->wait_objects.end(), [](const SharedPtr<WaitObject>& object) -> bool { + for (const auto& thread : waiting_threads) { + if (thread->current_priority >= candidate_priority) + continue; + + bool ready_to_run = std::none_of(thread->wait_objects.begin(), thread->wait_objects.end(), [](const SharedPtr<WaitObject>& object) { return object->ShouldWait(); }); - }), candidate_threads.end()); - - // Return the thread with the lowest priority value (The one with the highest priority) - auto thread_itr = std::min_element(candidate_threads.begin(), candidate_threads.end(), [](const SharedPtr<Thread>& lhs, const SharedPtr<Thread>& rhs) { - return lhs->current_priority < rhs->current_priority; - }); - - if (thread_itr == candidate_threads.end()) - return nullptr; + if (ready_to_run) { + candidate = thread; + candidate_priority = thread->current_priority; + } + } - return *thread_itr; + return candidate; } void WaitObject::WakeupAllWaitingThreads() { |