summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Lioncash2019-03-14 21:47:46 -0400
committerGravatar Lioncash2019-03-15 23:01:43 -0400
commit39483b92b7046c36ee937d80a7342b9ec6bc1ec4 (patch)
tree3ac045824e8cea6d93d58e9a8827b936d265d8d7
parentkernel/thread: Maintain priority ordering of added mutex waiting threads (diff)
downloadyuzu-39483b92b7046c36ee937d80a7342b9ec6bc1ec4.tar.gz
yuzu-39483b92b7046c36ee937d80a7342b9ec6bc1ec4.tar.xz
yuzu-39483b92b7046c36ee937d80a7342b9ec6bc1ec4.zip
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).
-rw-r--r--src/core/hle/kernel/thread.cpp6
1 files changed, 3 insertions, 3 deletions
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> thread) {
305void Thread::UpdatePriority() { 305void Thread::UpdatePriority() {
306 // Find the highest priority among all the threads that are waiting for this thread's lock 306 // Find the highest priority among all the threads that are waiting for this thread's lock
307 u32 new_priority = nominal_priority; 307 u32 new_priority = nominal_priority;
308 for (const auto& thread : wait_mutex_threads) { 308 if (!wait_mutex_threads.empty()) {
309 if (thread->nominal_priority < new_priority) 309 if (wait_mutex_threads.front()->current_priority < new_priority)
310 new_priority = thread->nominal_priority; 310 new_priority = wait_mutex_threads.front()->current_priority;
311 } 311 }
312 312
313 if (new_priority == current_priority) 313 if (new_priority == current_priority)