diff options
author | bunnei <bunneidev@gmail.com> | 2019-04-25 04:56:08 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-04-25 04:56:08 +0200 |
commit | 78574e7a470a29e7ef0c1cc062d334d133c60830 (patch) | |
tree | 9027d3466f0f588c5f14af0e23c7f7b128c79330 /src/core/hle/kernel/wait_object.cpp | |
parent | Merge pull request #2424 from FernandoS27/compat (diff) | |
parent | kernel/thread: Unify wait synchronization types (diff) | |
download | yuzu-78574e7a470a29e7ef0c1cc062d334d133c60830.tar yuzu-78574e7a470a29e7ef0c1cc062d334d133c60830.tar.gz yuzu-78574e7a470a29e7ef0c1cc062d334d133c60830.tar.bz2 yuzu-78574e7a470a29e7ef0c1cc062d334d133c60830.tar.lz yuzu-78574e7a470a29e7ef0c1cc062d334d133c60830.tar.xz yuzu-78574e7a470a29e7ef0c1cc062d334d133c60830.tar.zst yuzu-78574e7a470a29e7ef0c1cc062d334d133c60830.zip |
Diffstat (limited to 'src/core/hle/kernel/wait_object.cpp')
-rw-r--r-- | src/core/hle/kernel/wait_object.cpp | 29 |
1 files changed, 15 insertions, 14 deletions
diff --git a/src/core/hle/kernel/wait_object.cpp b/src/core/hle/kernel/wait_object.cpp index c8eaf9488..0e96ba872 100644 --- a/src/core/hle/kernel/wait_object.cpp +++ b/src/core/hle/kernel/wait_object.cpp @@ -38,8 +38,7 @@ SharedPtr<Thread> WaitObject::GetHighestPriorityReadyThread() const { const ThreadStatus thread_status = thread->GetStatus(); // The list of waiting threads must not contain threads that are not waiting to be awakened. - ASSERT_MSG(thread_status == ThreadStatus::WaitSynchAny || - thread_status == ThreadStatus::WaitSynchAll || + ASSERT_MSG(thread_status == ThreadStatus::WaitSynch || thread_status == ThreadStatus::WaitHLEEvent, "Inconsistent thread statuses in waiting_threads"); @@ -49,10 +48,10 @@ SharedPtr<Thread> WaitObject::GetHighestPriorityReadyThread() const { if (ShouldWait(thread.get())) continue; - // A thread is ready to run if it's either in ThreadStatus::WaitSynchAny or - // in ThreadStatus::WaitSynchAll and the rest of the objects it is waiting on are ready. + // A thread is ready to run if it's either in ThreadStatus::WaitSynch + // and the rest of the objects it is waiting on are ready. bool ready_to_run = true; - if (thread_status == ThreadStatus::WaitSynchAll) { + if (thread_status == ThreadStatus::WaitSynch) { ready_to_run = thread->AllWaitObjectsReady(); } @@ -68,33 +67,35 @@ SharedPtr<Thread> WaitObject::GetHighestPriorityReadyThread() const { void WaitObject::WakeupWaitingThread(SharedPtr<Thread> thread) { ASSERT(!ShouldWait(thread.get())); - if (!thread) + if (!thread) { return; + } - if (!thread->IsSleepingOnWaitAll()) { - Acquire(thread.get()); - } else { + if (thread->IsSleepingOnWait()) { for (const auto& object : thread->GetWaitObjects()) { ASSERT(!object->ShouldWait(thread.get())); object->Acquire(thread.get()); } + } else { + Acquire(thread.get()); } const std::size_t index = thread->GetWaitObjectIndex(this); - for (const auto& object : thread->GetWaitObjects()) + for (const auto& object : thread->GetWaitObjects()) { object->RemoveWaitingThread(thread.get()); + } thread->ClearWaitObjects(); thread->CancelWakeupTimer(); bool resume = true; - - if (thread->HasWakeupCallback()) + if (thread->HasWakeupCallback()) { resume = thread->InvokeWakeupCallback(ThreadWakeupReason::Signal, thread, this, index); - - if (resume) + } + if (resume) { thread->ResumeFromWait(); + } } void WaitObject::WakeupAllWaitingThreads() { |