diff options
| -rw-r--r-- | src/core/hle/kernel/wait_object.cpp | 37 | ||||
| -rw-r--r-- | src/core/hle/kernel/wait_object.h | 6 | 
2 files changed, 28 insertions, 15 deletions
diff --git a/src/core/hle/kernel/wait_object.cpp b/src/core/hle/kernel/wait_object.cpp index 469554908..c942a40fa 100644 --- a/src/core/hle/kernel/wait_object.cpp +++ b/src/core/hle/kernel/wait_object.cpp @@ -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);      }  } diff --git a/src/core/hle/kernel/wait_object.h b/src/core/hle/kernel/wait_object.h index 861578186..78bfd8c6c 100644 --- a/src/core/hle/kernel/wait_object.h +++ b/src/core/hle/kernel/wait_object.h @@ -44,6 +44,12 @@ public:       */      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.      SharedPtr<Thread> GetHighestPriorityReadyThread();  | 
