瀏覽代碼

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).
Lioncash 7 年之前
父節點
當前提交
39483b92b7
共有 1 個文件被更改,包括 3 次插入3 次删除
  1. 3 3
      src/core/hle/kernel/thread.cpp

+ 3 - 3
src/core/hle/kernel/thread.cpp

@@ -305,9 +305,9 @@ void Thread::RemoveMutexWaiter(SharedPtr<Thread> 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)