Scheduler: Protect on closed threads.

This commit is contained in:
Fernando Sahmkow 2020-03-06 20:20:36 -04:00
parent 19847d4d42
commit 3de33348e4
1 changed files with 17 additions and 7 deletions

View File

@ -604,7 +604,6 @@ void Scheduler::SwitchContextStep2() {
if (new_thread) { if (new_thread) {
auto& cpu_core = system.ArmInterface(core_id); auto& cpu_core = system.ArmInterface(core_id);
new_thread->context_guard.lock();
cpu_core.Lock(); cpu_core.Lock();
ASSERT_MSG(new_thread->GetSchedulingStatus() == ThreadSchedStatus::Runnable, ASSERT_MSG(new_thread->GetSchedulingStatus() == ThreadSchedStatus::Runnable,
"Thread must be runnable."); "Thread must be runnable.");
@ -685,6 +684,16 @@ void Scheduler::OnSwitch(void* this_scheduler) {
void Scheduler::SwitchToCurrent() { void Scheduler::SwitchToCurrent() {
while (true) { while (true) {
guard.lock();
selected_thread = selected_thread_set;
current_thread = selected_thread;
guard.unlock();
while (!is_context_switch_pending) {
current_thread->context_guard.lock();
if (current_thread->GetSchedulingStatus() != ThreadSchedStatus::Runnable) {
current_thread->context_guard.unlock();
break;
}
std::shared_ptr<Common::Fiber> next_context; std::shared_ptr<Common::Fiber> next_context;
if (current_thread != nullptr) { if (current_thread != nullptr) {
next_context = current_thread->GetHostContext(); next_context = current_thread->GetHostContext();
@ -693,6 +702,7 @@ void Scheduler::SwitchToCurrent() {
} }
Common::Fiber::YieldTo(switch_fiber, next_context); Common::Fiber::YieldTo(switch_fiber, next_context);
} }
}
} }
void Scheduler::UpdateLastContextSwitchTime(Thread* thread, Process* process) { void Scheduler::UpdateLastContextSwitchTime(Thread* thread, Process* process) {