Browse Source

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

nce_cpp
Fernando Sahmkow 6 years ago
committed by FernandoS27
parent
commit
3da21e4b4f
  1. 1
      src/core/hle/kernel/thread.cpp
  2. 3
      src/core/hle/kernel/thread.h
  3. 3
      src/core/hle/kernel/wait_object.cpp

1
src/core/hle/kernel/thread.cpp

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

3
src/core/hle/kernel/thread.h

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

3
src/core/hle/kernel/wait_object.cpp

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

Loading…
Cancel
Save