forked from ShuriZma/suyu
1
0
Fork 0

scheduler: Avoid manual Reschedule call

This will automatically occur anyway when PrepareReschedule is called
This commit is contained in:
Zach Hilman 2018-12-03 21:22:09 -05:00
parent b5af41a07b
commit ddf5903cd9
2 changed files with 11 additions and 11 deletions

View File

@ -200,7 +200,6 @@ void Scheduler::YieldWithoutLoadBalancing(Thread* thread) {
// Yield this thread -- sleep for zero time and force reschedule to different thread // Yield this thread -- sleep for zero time and force reschedule to different thread
WaitCurrentThread_Sleep(); WaitCurrentThread_Sleep();
GetCurrentThread()->WakeAfterDelay(0); GetCurrentThread()->WakeAfterDelay(0);
Reschedule();
} }
void Scheduler::YieldWithLoadBalancing(Thread* thread) { void Scheduler::YieldWithLoadBalancing(Thread* thread) {
@ -223,24 +222,23 @@ void Scheduler::YieldWithLoadBalancing(Thread* thread) {
// Search through all of the cpu cores (except this one) for a suggested thread. // Search through all of the cpu cores (except this one) for a suggested thread.
// Take the first non-nullptr one // Take the first non-nullptr one
for (unsigned cur_core = 0; cur_core < Core::NUM_CPU_CORES; ++cur_core) { for (unsigned cur_core = 0; cur_core < Core::NUM_CPU_CORES; ++cur_core) {
if (cur_core == core)
continue;
const auto res = const auto res =
Core::System::GetInstance().CpuCore(cur_core).Scheduler().GetNextSuggestedThread( Core::System::GetInstance().CpuCore(cur_core).Scheduler().GetNextSuggestedThread(
core, priority); core, priority);
if (res != nullptr &&
(suggested_thread == nullptr || suggested_thread->GetPriority() > res->GetPriority())) { // If scheduler provides a suggested thread
suggested_thread = res; if (res != nullptr) {
// And its better than the current suggested thread (or is the first valid one)
if (suggested_thread == nullptr ||
suggested_thread->GetPriority() > res->GetPriority()) {
suggested_thread = res;
}
} }
} }
// If a suggested thread was found, queue that for this core // If a suggested thread was found, queue that for this core
if (suggested_thread != nullptr) if (suggested_thread != nullptr)
suggested_thread->ChangeCore(core, suggested_thread->GetAffinityMask()); suggested_thread->ChangeCore(core, suggested_thread->GetAffinityMask());
// Perform actual yielding.
Reschedule();
} }
void Scheduler::YieldAndWaitForLoadBalancing(Thread* thread) { void Scheduler::YieldAndWaitForLoadBalancing(Thread* thread) {

View File

@ -994,7 +994,9 @@ static void SleepThread(s64 nanoseconds) {
GetCurrentThread()->WakeAfterDelay(nanoseconds); GetCurrentThread()->WakeAfterDelay(nanoseconds);
} }
Core::System::GetInstance().PrepareReschedule(); // Reschedule all CPU cores
for (std::size_t i = 0; i < 4; ++i)
Core::System::GetInstance().CpuCore(i).PrepareReschedule();
} }
/// Wait process wide key atomic /// Wait process wide key atomic