wait_object: Refactor to allow waking up a single thread.

This commit is contained in:
bunnei 2018-01-07 16:33:41 -05:00
parent bc77a7580e
commit 0f6fbdb963
2 changed files with 30 additions and 17 deletions

View file

@ -67,8 +67,10 @@ SharedPtr<Thread> WaitObject::GetHighestPriorityReadyThread() {
return candidate; return candidate;
} }
void WaitObject::WakeupAllWaitingThreads() { void WaitObject::WakeupWaitingThread(SharedPtr<Thread> thread) {
while (auto thread = GetHighestPriorityReadyThread()) { if (!thread)
return;
if (!thread->IsSleepingOnWaitAll()) { if (!thread->IsSleepingOnWaitAll()) {
Acquire(thread.get()); Acquire(thread.get());
} else { } else {
@ -87,6 +89,11 @@ void WaitObject::WakeupAllWaitingThreads() {
thread->ResumeFromWait(); thread->ResumeFromWait();
} }
void WaitObject::WakeupAllWaitingThreads() {
while (auto thread = GetHighestPriorityReadyThread()) {
WakeupWaitingThread(thread);
}
} }
const std::vector<SharedPtr<Thread>>& WaitObject::GetWaitingThreads() const { const std::vector<SharedPtr<Thread>>& WaitObject::GetWaitingThreads() const {

View file

@ -44,6 +44,12 @@ public:
*/ */
virtual void WakeupAllWaitingThreads(); virtual void WakeupAllWaitingThreads();
/**
* Wakes up a single thread waiting on this object.
* @param thread Thread that is waiting on this object to wakeup.
*/
void WakeupWaitingThread(SharedPtr<Thread> thread);
/// Obtains the highest priority thread that is ready to run from this object's waiting list. /// Obtains the highest priority thread that is ready to run from this object's waiting list.
SharedPtr<Thread> GetHighestPriorityReadyThread(); SharedPtr<Thread> GetHighestPriorityReadyThread();