Kernel/Mutex: Update a mutex priority when a thread stops waiting on it.
This commit is contained in:
parent
7abf185390
commit
b6a0355568
5 changed files with 42 additions and 24 deletions
|
@ -3,7 +3,6 @@
|
|||
// Refer to the license.txt file included.
|
||||
|
||||
#include <algorithm>
|
||||
#include <boost/range/algorithm_ext/erase.hpp>
|
||||
#include "common/assert.h"
|
||||
#include "common/logging/log.h"
|
||||
#include "core/hle/config_mem.h"
|
||||
|
@ -34,10 +33,17 @@ void WaitObject::RemoveWaitingThread(Thread* thread) {
|
|||
|
||||
SharedPtr<Thread> WaitObject::GetHighestPriorityReadyThread() {
|
||||
// Remove the threads that are ready or already running from our waitlist
|
||||
boost::range::remove_erase_if(waiting_threads, [](const SharedPtr<Thread>& thread) {
|
||||
return thread->status == THREADSTATUS_RUNNING || thread->status == THREADSTATUS_READY ||
|
||||
thread->status == THREADSTATUS_DEAD;
|
||||
});
|
||||
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;
|
||||
|
@ -49,9 +55,10 @@ SharedPtr<Thread> WaitObject::GetHighestPriorityReadyThread() {
|
|||
if (ShouldWait(thread.get()))
|
||||
continue;
|
||||
|
||||
bool ready_to_run =
|
||||
std::none_of(thread->wait_objects.begin(), thread->wait_objects.end(),
|
||||
[&thread](const SharedPtr<WaitObject>& object) { return object->ShouldWait(thread.get()); });
|
||||
bool ready_to_run = std::none_of(thread->wait_objects.begin(), thread->wait_objects.end(),
|
||||
[&thread](const SharedPtr<WaitObject>& object) {
|
||||
return object->ShouldWait(thread.get());
|
||||
});
|
||||
if (ready_to_run) {
|
||||
candidate = thread.get();
|
||||
candidate_priority = thread->current_priority;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue