summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/core/hle/kernel/wait_object.cpp37
-rw-r--r--src/core/hle/kernel/wait_object.h6
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();