|
|
|
@ -67,25 +67,32 @@ SharedPtr<Thread> WaitObject::GetHighestPriorityReadyThread() { |
|
|
|
return candidate; |
|
|
|
} |
|
|
|
|
|
|
|
void WaitObject::WakeupAllWaitingThreads() { |
|
|
|
while (auto thread = GetHighestPriorityReadyThread()) { |
|
|
|
if (!thread->IsSleepingOnWaitAll()) { |
|
|
|
Acquire(thread.get()); |
|
|
|
} else { |
|
|
|
for (auto& object : thread->wait_objects) { |
|
|
|
object->Acquire(thread.get()); |
|
|
|
} |
|
|
|
void WaitObject::WakeupWaitingThread(SharedPtr<Thread> thread) { |
|
|
|
if (!thread) |
|
|
|
return; |
|
|
|
|
|
|
|
if (!thread->IsSleepingOnWaitAll()) { |
|
|
|
Acquire(thread.get()); |
|
|
|
} else { |
|
|
|
for (auto& object : thread->wait_objects) { |
|
|
|
object->Acquire(thread.get()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// Invoke the wakeup callback before clearing the wait objects
|
|
|
|
if (thread->wakeup_callback) |
|
|
|
thread->wakeup_callback(ThreadWakeupReason::Signal, thread, this); |
|
|
|
// Invoke the wakeup callback before clearing the wait objects
|
|
|
|
if (thread->wakeup_callback) |
|
|
|
thread->wakeup_callback(ThreadWakeupReason::Signal, thread, this); |
|
|
|
|
|
|
|
for (auto& object : thread->wait_objects) |
|
|
|
object->RemoveWaitingThread(thread.get()); |
|
|
|
thread->wait_objects.clear(); |
|
|
|
for (auto& object : thread->wait_objects) |
|
|
|
object->RemoveWaitingThread(thread.get()); |
|
|
|
thread->wait_objects.clear(); |
|
|
|
|
|
|
|
thread->ResumeFromWait(); |
|
|
|
thread->ResumeFromWait(); |
|
|
|
} |
|
|
|
|
|
|
|
void WaitObject::WakeupAllWaitingThreads() { |
|
|
|
while (auto thread = GetHighestPriorityReadyThread()) { |
|
|
|
WakeupWaitingThread(thread); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|