forked from ShuriZma/suyu
1
0
Fork 0

core: hle: kernel: k_scheduler: Improve DisableScheduling and EnableScheduling.

This commit is contained in:
bunnei 2021-08-06 23:27:33 -07:00
parent d604edfedf
commit 284015dfd7
1 changed files with 9 additions and 14 deletions

View File

@ -376,20 +376,18 @@ void KScheduler::ClearSchedulerUpdateNeeded(KernelCore& kernel) {
} }
void KScheduler::DisableScheduling(KernelCore& kernel) { void KScheduler::DisableScheduling(KernelCore& kernel) {
if (auto* scheduler = kernel.CurrentScheduler(); scheduler) { ASSERT(GetCurrentThreadPointer(kernel)->GetDisableDispatchCount() >= 0);
ASSERT(scheduler->GetCurrentThread()->GetDisableDispatchCount() >= 0); GetCurrentThreadPointer(kernel)->DisableDispatch();
scheduler->GetCurrentThread()->DisableDispatch();
}
} }
void KScheduler::EnableScheduling(KernelCore& kernel, u64 cores_needing_scheduling) { void KScheduler::EnableScheduling(KernelCore& kernel, u64 cores_needing_scheduling) {
if (auto* scheduler = kernel.CurrentScheduler(); scheduler) { ASSERT(GetCurrentThreadPointer(kernel)->GetDisableDispatchCount() >= 1);
ASSERT(scheduler->GetCurrentThread()->GetDisableDispatchCount() >= 1);
if (scheduler->GetCurrentThread()->GetDisableDispatchCount() >= 1) { if (GetCurrentThreadPointer(kernel)->GetDisableDispatchCount() > 1) {
scheduler->GetCurrentThread()->EnableDispatch(); GetCurrentThreadPointer(kernel)->EnableDispatch();
} } else {
RescheduleCores(kernel, cores_needing_scheduling);
} }
RescheduleCores(kernel, cores_needing_scheduling);
} }
u64 KScheduler::UpdateHighestPriorityThreads(KernelCore& kernel) { u64 KScheduler::UpdateHighestPriorityThreads(KernelCore& kernel) {
@ -646,6 +644,7 @@ void KScheduler::RescheduleCurrentCore() {
if (phys_core.IsInterrupted()) { if (phys_core.IsInterrupted()) {
phys_core.ClearInterrupt(); phys_core.ClearInterrupt();
} }
guard.Lock(); guard.Lock();
if (state.needs_scheduling.load()) { if (state.needs_scheduling.load()) {
Schedule(); Schedule();
@ -662,10 +661,6 @@ void KScheduler::OnThreadStart() {
void KScheduler::Unload(KThread* thread) { void KScheduler::Unload(KThread* thread) {
ASSERT(thread); ASSERT(thread);
if (!thread) {
return;
}
LOG_TRACE(Kernel, "core {}, unload thread {}", core_id, thread ? thread->GetName() : "nullptr"); LOG_TRACE(Kernel, "core {}, unload thread {}", core_id, thread ? thread->GetName() : "nullptr");
if (thread->IsCallingSvc()) { if (thread->IsCallingSvc()) {