Add PrepareReschedule where required.
This commit is contained in:
parent
b8b7ebcece
commit
b5d1e44782
3 changed files with 18 additions and 16 deletions
|
@ -22,6 +22,8 @@ namespace Kernel {
|
||||||
namespace {
|
namespace {
|
||||||
// Wake up num_to_wake (or all) threads in a vector.
|
// Wake up num_to_wake (or all) threads in a vector.
|
||||||
void WakeThreads(const std::vector<SharedPtr<Thread>>& waiting_threads, s32 num_to_wake) {
|
void WakeThreads(const std::vector<SharedPtr<Thread>>& waiting_threads, s32 num_to_wake) {
|
||||||
|
|
||||||
|
auto& system = Core::System::GetInstance();
|
||||||
// Only process up to 'target' threads, unless 'target' is <= 0, in which case process
|
// Only process up to 'target' threads, unless 'target' is <= 0, in which case process
|
||||||
// them all.
|
// them all.
|
||||||
std::size_t last = waiting_threads.size();
|
std::size_t last = waiting_threads.size();
|
||||||
|
@ -35,6 +37,8 @@ void WakeThreads(const std::vector<SharedPtr<Thread>>& waiting_threads, s32 num_
|
||||||
waiting_threads[i]->SetWaitSynchronizationResult(RESULT_SUCCESS);
|
waiting_threads[i]->SetWaitSynchronizationResult(RESULT_SUCCESS);
|
||||||
waiting_threads[i]->SetArbiterWaitAddress(0);
|
waiting_threads[i]->SetArbiterWaitAddress(0);
|
||||||
waiting_threads[i]->ResumeFromWait();
|
waiting_threads[i]->ResumeFromWait();
|
||||||
|
if (waiting_threads[i]->GetProcessorID() >= 0)
|
||||||
|
system.CpuCore(waiting_threads[i]->GetProcessorID()).PrepareReschedule();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} // Anonymous namespace
|
} // Anonymous namespace
|
||||||
|
@ -174,25 +178,17 @@ ResultCode AddressArbiter::WaitForAddressImpl(VAddr address, s64 timeout) {
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<SharedPtr<Thread>> AddressArbiter::GetThreadsWaitingOnAddress(VAddr address) const {
|
std::vector<SharedPtr<Thread>> AddressArbiter::GetThreadsWaitingOnAddress(VAddr address) const {
|
||||||
const auto RetrieveWaitingThreads = [this](std::size_t core_index,
|
|
||||||
std::vector<SharedPtr<Thread>>& waiting_threads,
|
|
||||||
VAddr arb_addr) {
|
|
||||||
const auto& scheduler = system.Scheduler(core_index);
|
|
||||||
const auto& thread_list = scheduler.GetThreadList();
|
|
||||||
|
|
||||||
for (const auto& thread : thread_list) {
|
|
||||||
if (thread->GetArbiterWaitAddress() == arb_addr) {
|
|
||||||
waiting_threads.push_back(thread);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Retrieve all threads that are waiting for this address.
|
// Retrieve all threads that are waiting for this address.
|
||||||
std::vector<SharedPtr<Thread>> threads;
|
std::vector<SharedPtr<Thread>> threads;
|
||||||
RetrieveWaitingThreads(0, threads, address);
|
const auto& scheduler = system.GlobalScheduler();
|
||||||
RetrieveWaitingThreads(1, threads, address);
|
const auto& thread_list = scheduler.GetThreadList();
|
||||||
RetrieveWaitingThreads(2, threads, address);
|
|
||||||
RetrieveWaitingThreads(3, threads, address);
|
for (const auto& thread : thread_list) {
|
||||||
|
if (thread->GetArbiterWaitAddress() == address) {
|
||||||
|
threads.push_back(thread);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Sort them by priority, such that the highest priority ones come first.
|
// Sort them by priority, such that the highest priority ones come first.
|
||||||
std::sort(threads.begin(), threads.end(),
|
std::sort(threads.begin(), threads.end(),
|
||||||
|
|
|
@ -140,6 +140,8 @@ ResultCode Mutex::Release(VAddr address) {
|
||||||
thread->SetMutexWaitAddress(0);
|
thread->SetMutexWaitAddress(0);
|
||||||
thread->SetWaitHandle(0);
|
thread->SetWaitHandle(0);
|
||||||
|
|
||||||
|
Core::System::GetInstance().PrepareReschedule();
|
||||||
|
|
||||||
return RESULT_SUCCESS;
|
return RESULT_SUCCESS;
|
||||||
}
|
}
|
||||||
} // namespace Kernel
|
} // namespace Kernel
|
||||||
|
|
|
@ -6,6 +6,8 @@
|
||||||
#include "common/assert.h"
|
#include "common/assert.h"
|
||||||
#include "common/common_types.h"
|
#include "common/common_types.h"
|
||||||
#include "common/logging/log.h"
|
#include "common/logging/log.h"
|
||||||
|
#include "core/core.h"
|
||||||
|
#include "core/core_cpu.h"
|
||||||
#include "core/hle/kernel/object.h"
|
#include "core/hle/kernel/object.h"
|
||||||
#include "core/hle/kernel/process.h"
|
#include "core/hle/kernel/process.h"
|
||||||
#include "core/hle/kernel/thread.h"
|
#include "core/hle/kernel/thread.h"
|
||||||
|
@ -95,6 +97,8 @@ void WaitObject::WakeupWaitingThread(SharedPtr<Thread> thread) {
|
||||||
}
|
}
|
||||||
if (resume) {
|
if (resume) {
|
||||||
thread->ResumeFromWait();
|
thread->ResumeFromWait();
|
||||||
|
if (thread->GetProcessorID() >= 0)
|
||||||
|
Core::System::GetInstance().CpuCore(thread->GetProcessorID()).PrepareReschedule();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue