From 39483b92b7046c36ee937d80a7342b9ec6bc1ec4 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Thu, 14 Mar 2019 21:47:46 -0400 Subject: kernel/thread: Amend condition within UpdatePriority() This condition was checking against the nominal thread priority, whereas the kernel itself checks against the current priority instead. We were also assigning the nominal priority, when we should be assigning current_priority, which takes priority inheritance into account. This can lead to the incorrect priority being assigned to a thread. Given we recursively update the relevant threads, we don't need to go through the whole mutex waiter list. This matches what the kernel does as well (only accessing the first entry within the waiting list). --- src/core/hle/kernel/thread.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/core/hle/kernel/thread.cpp') diff --git a/src/core/hle/kernel/thread.cpp b/src/core/hle/kernel/thread.cpp index 7706ca9e5..4b68b555f 100644 --- a/src/core/hle/kernel/thread.cpp +++ b/src/core/hle/kernel/thread.cpp @@ -305,9 +305,9 @@ void Thread::RemoveMutexWaiter(SharedPtr thread) { void Thread::UpdatePriority() { // Find the highest priority among all the threads that are waiting for this thread's lock u32 new_priority = nominal_priority; - for (const auto& thread : wait_mutex_threads) { - if (thread->nominal_priority < new_priority) - new_priority = thread->nominal_priority; + if (!wait_mutex_threads.empty()) { + if (wait_mutex_threads.front()->current_priority < new_priority) + new_priority = wait_mutex_threads.front()->current_priority; } if (new_priority == current_priority) -- cgit v1.2.3