1
0
Fork 0
forked from suyu/suyu

Kernel: Corrections to Wait Objects clearing in which a thread could still be signalled after a timeout or a cancel.

This commit is contained in:
Fernando Sahmkow 2019-10-10 08:04:14 -04:00 committed by FernandoS27
parent 27d571c084
commit 1c6a11ab14
3 changed files with 4 additions and 3 deletions

View file

@ -133,6 +133,7 @@ void Thread::ResumeFromWait() {
void Thread::CancelWait() { void Thread::CancelWait() {
ASSERT(GetStatus() == ThreadStatus::WaitSynch); ASSERT(GetStatus() == ThreadStatus::WaitSynch);
ClearWaitObjects();
SetWaitSynchronizationResult(ERR_SYNCHRONIZATION_CANCELED); SetWaitSynchronizationResult(ERR_SYNCHRONIZATION_CANCELED);
ResumeFromWait(); ResumeFromWait();
} }

View file

@ -319,6 +319,9 @@ public:
} }
void ClearWaitObjects() { void ClearWaitObjects() {
for (const auto& waiting_object : wait_objects) {
waiting_object->RemoveWaitingThread(this);
}
wait_objects.clear(); wait_objects.clear();
} }

View file

@ -85,9 +85,6 @@ void WaitObject::WakeupWaitingThread(SharedPtr<Thread> thread) {
const std::size_t index = thread->GetWaitObjectIndex(this); const std::size_t index = thread->GetWaitObjectIndex(this);
for (const auto& object : thread->GetWaitObjects()) {
object->RemoveWaitingThread(thread.get());
}
thread->ClearWaitObjects(); thread->ClearWaitObjects();
thread->CancelWakeupTimer(); thread->CancelWakeupTimer();