|
|
@ -308,14 +308,20 @@ void KThread::Finalize() {
|
|
|
|
|
|
|
|
|
|
|
|
auto it = waiter_list.begin();
|
|
|
|
auto it = waiter_list.begin();
|
|
|
|
while (it != waiter_list.end()) {
|
|
|
|
while (it != waiter_list.end()) {
|
|
|
|
// Clear the lock owner
|
|
|
|
// Get the thread.
|
|
|
|
it->SetLockOwner(nullptr);
|
|
|
|
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.
|
|
|
|
// Erase the waiter from our list.
|
|
|
|
it = waiter_list.erase(it);
|
|
|
|
it = waiter_list.erase(it);
|
|
|
|
|
|
|
|
|
|
|
|
// Cancel the thread's wait.
|
|
|
|
// Cancel the thread's wait.
|
|
|
|
it->CancelWait(ResultInvalidState, true);
|
|
|
|
waiter->CancelWait(ResultInvalidState, true);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|