forked from suyu/suyu
hle: kernel: KScheduler: Introduce thread context_guard.
This commit is contained in:
parent
cdd14b03e5
commit
ca78f77827
2 changed files with 16 additions and 3 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -712,6 +712,7 @@ private:
|
||||||
s8 priority_inheritance_count{};
|
s8 priority_inheritance_count{};
|
||||||
bool resource_limit_release_hint{};
|
bool resource_limit_release_hint{};
|
||||||
StackParameters stack_parameters{};
|
StackParameters stack_parameters{};
|
||||||
|
Common::SpinLock context_guard{};
|
||||||
|
|
||||||
// For emulation
|
// For emulation
|
||||||
std::shared_ptr<Common::Fiber> host_context{};
|
std::shared_ptr<Common::Fiber> host_context{};
|
||||||
|
|
Loading…
Reference in a new issue