Просмотр исходного кода

Merge pull request #8559 from liamwhite/waiter-list

kernel: fix usage of waiter_list in Finalize
bunnei 4 лет назад
Родитель
Сommit
802bbb2263
1 измененных файлов с 9 добавлено и 3 удалено
  1. 9 3
      src/core/hle/kernel/k_thread.cpp

+ 9 - 3
src/core/hle/kernel/k_thread.cpp

@@ -308,14 +308,20 @@ void KThread::Finalize() {
 
         auto it = waiter_list.begin();
         while (it != waiter_list.end()) {
-            // Clear the lock owner
-            it->SetLockOwner(nullptr);
+            // Get the thread.
+            KThread* const waiter = std::addressof(*it);
+
+            // The thread shouldn't be a kernel waiter.
+            ASSERT(!IsKernelAddressKey(waiter->GetAddressKey()));
+
+            // Clear the lock owner.
+            waiter->SetLockOwner(nullptr);
 
             // Erase the waiter from our list.
             it = waiter_list.erase(it);
 
             // Cancel the thread's wait.
-            it->CancelWait(ResultInvalidState, true);
+            waiter->CancelWait(ResultInvalidState, true);
         }
     }