Kernel: Allow chaining WaitSynchronization calls inside a wakeup callback.

This commit is contained in:
Subv 2018-01-08 11:35:03 -05:00 committed by bunnei
parent 1b9ed033fc
commit 2a3f8e8484
4 changed files with 78 additions and 30 deletions

View file

@ -68,6 +68,8 @@ SharedPtr<Thread> WaitObject::GetHighestPriorityReadyThread() {
}
void WaitObject::WakeupWaitingThread(SharedPtr<Thread> thread) {
ASSERT(!ShouldWait(thread.get()));
if (!thread)
return;
@ -75,19 +77,26 @@ void WaitObject::WakeupWaitingThread(SharedPtr<Thread> thread) {
Acquire(thread.get());
} else {
for (auto& object : thread->wait_objects) {
ASSERT(!object->ShouldWait(thread.get()));
object->Acquire(thread.get());
}
}
// Invoke the wakeup callback before clearing the wait objects
if (thread->wakeup_callback)
thread->wakeup_callback(ThreadWakeupReason::Signal, thread, this);
size_t index = thread->GetWaitObjectIndex(this);
for (auto& object : thread->wait_objects)
object->RemoveWaitingThread(thread.get());
thread->wait_objects.clear();
thread->ResumeFromWait();
thread->CancelWakeupTimer();
bool resume = true;
if (thread->wakeup_callback)
resume = thread->wakeup_callback(ThreadWakeupReason::Signal, thread, this, index);
if (resume)
thread->ResumeFromWait();
}
void WaitObject::WakeupAllWaitingThreads() {