|
|
@@ -32,19 +32,6 @@ void WaitObject::RemoveWaitingThread(Thread* thread) {
|
|
|
}
|
|
|
|
|
|
SharedPtr<Thread> WaitObject::GetHighestPriorityReadyThread() {
|
|
|
- // Remove the threads that are ready or already running from our waitlist
|
|
|
- auto to_remove = waiting_threads.end();
|
|
|
- do {
|
|
|
- to_remove = std::find_if(waiting_threads.begin(), waiting_threads.end(),
|
|
|
- [](const SharedPtr<Thread>& thread) {
|
|
|
- return thread->status == THREADSTATUS_RUNNING ||
|
|
|
- thread->status == THREADSTATUS_READY ||
|
|
|
- thread->status == THREADSTATUS_DEAD;
|
|
|
- });
|
|
|
- // Call RemoveWaitingThread so that child classes can override the behavior.
|
|
|
- RemoveWaitingThread(to_remove->get());
|
|
|
- } while (to_remove != waiting_threads.end());
|
|
|
-
|
|
|
Thread* candidate = nullptr;
|
|
|
s32 candidate_priority = THREADPRIO_LOWEST + 1;
|
|
|
|
|
|
@@ -86,17 +73,16 @@ void WaitObject::WakeupAllWaitingThreads() {
|
|
|
} else {
|
|
|
for (auto& object : thread->wait_objects) {
|
|
|
object->Acquire(thread.get());
|
|
|
- object->RemoveWaitingThread(thread.get());
|
|
|
}
|
|
|
// Note: This case doesn't update the output index of WaitSynchronizationN.
|
|
|
- // Clear the thread's waitlist
|
|
|
- thread->wait_objects.clear();
|
|
|
}
|
|
|
|
|
|
+ for (auto& object : thread->wait_objects)
|
|
|
+ object->RemoveWaitingThread(thread.get());
|
|
|
+ thread->wait_objects.clear();
|
|
|
+
|
|
|
thread->SetWaitSynchronizationResult(RESULT_SUCCESS);
|
|
|
thread->ResumeFromWait();
|
|
|
- // Note: Removing the thread from the object's waitlist will be
|
|
|
- // done by GetHighestPriorityReadyThread.
|
|
|
}
|
|
|
}
|
|
|
|