summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel/kernel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/hle/kernel/kernel.cpp')
-rw-r--r--src/core/hle/kernel/kernel.cpp27
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() {
40 if (waiting_threads.empty()) 40 if (waiting_threads.empty())
41 return nullptr; 41 return nullptr;
42 42
43 auto candidate_threads = waiting_threads; 43 SharedPtr<Thread> candidate = nullptr;
44 s32 candidate_priority = THREADPRIO_LOWEST + 1;
44 45
45 // Eliminate all threads that are waiting on more than one object, and not all of said objects are ready 46 for (const auto& thread : waiting_threads) {
46 candidate_threads.erase(std::remove_if(candidate_threads.begin(), candidate_threads.end(), [](const SharedPtr<Thread>& thread) -> bool { 47 if (thread->current_priority >= candidate_priority)
47 return std::any_of(thread->wait_objects.begin(), thread->wait_objects.end(), [](const SharedPtr<WaitObject>& object) -> bool { 48 continue;
49
50 bool ready_to_run = std::none_of(thread->wait_objects.begin(), thread->wait_objects.end(), [](const SharedPtr<WaitObject>& object) {
48 return object->ShouldWait(); 51 return object->ShouldWait();
49 }); 52 });
50 }), candidate_threads.end()); 53 if (ready_to_run) {
51 54 candidate = thread;
52 // Return the thread with the lowest priority value (The one with the highest priority) 55 candidate_priority = thread->current_priority;
53 auto thread_itr = std::min_element(candidate_threads.begin(), candidate_threads.end(), [](const SharedPtr<Thread>& lhs, const SharedPtr<Thread>& rhs) { 56 }
54 return lhs->current_priority < rhs->current_priority; 57 }
55 });
56
57 if (thread_itr == candidate_threads.end())
58 return nullptr;
59 58
60 return *thread_itr; 59 return candidate;
61} 60}
62 61
63void WaitObject::WakeupAllWaitingThreads() { 62void WaitObject::WakeupAllWaitingThreads() {