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:
parent
27d571c084
commit
1c6a11ab14
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Reference in New Issue