|
|
@ -668,6 +668,7 @@ void KScheduler::Unload(KThread* thread) { |
|
|
} else { |
|
|
} else { |
|
|
prev_thread = nullptr; |
|
|
prev_thread = nullptr; |
|
|
} |
|
|
} |
|
|
|
|
|
thread->context_guard.unlock(); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@ -700,15 +701,23 @@ void KScheduler::SwitchContextStep2() { |
|
|
|
|
|
|
|
|
void KScheduler::ScheduleImpl() { |
|
|
void KScheduler::ScheduleImpl() { |
|
|
KThread* previous_thread = current_thread; |
|
|
KThread* previous_thread = current_thread; |
|
|
current_thread = state.highest_priority_thread; |
|
|
|
|
|
|
|
|
KThread* next_thread = state.highest_priority_thread; |
|
|
|
|
|
|
|
|
state.needs_scheduling = false; |
|
|
state.needs_scheduling = false; |
|
|
|
|
|
|
|
|
if (current_thread == previous_thread) { |
|
|
|
|
|
|
|
|
// We never want to schedule a null thread, so use the idle thread if we don't have a next.
|
|
|
|
|
|
if (next_thread == nullptr) { |
|
|
|
|
|
next_thread = idle_thread; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// If we're not actually switching thread, there's nothing to do.
|
|
|
|
|
|
if (next_thread == current_thread) { |
|
|
guard.unlock(); |
|
|
guard.unlock(); |
|
|
return; |
|
|
return; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
current_thread = next_thread; |
|
|
|
|
|
|
|
|
Process* const previous_process = system.Kernel().CurrentProcess(); |
|
|
Process* const previous_process = system.Kernel().CurrentProcess(); |
|
|
|
|
|
|
|
|
UpdateLastContextSwitchTime(previous_thread, previous_process); |
|
|
UpdateLastContextSwitchTime(previous_thread, previous_process); |
|
|
@ -748,10 +757,13 @@ void KScheduler::SwitchToCurrent() { |
|
|
}; |
|
|
}; |
|
|
do { |
|
|
do { |
|
|
if (current_thread != nullptr) { |
|
|
if (current_thread != nullptr) { |
|
|
|
|
|
current_thread->context_guard.lock(); |
|
|
if (current_thread->GetRawState() != ThreadState::Runnable) { |
|
|
if (current_thread->GetRawState() != ThreadState::Runnable) { |
|
|
|
|
|
current_thread->context_guard.unlock(); |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
if (static_cast<u32>(current_thread->GetActiveCore()) != core_id) { |
|
|
|
|
|
|
|
|
if (current_thread->GetActiveCore() != core_id) { |
|
|
|
|
|
current_thread->context_guard.unlock(); |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|