forked from suyu/suyu
Scheduler: Protect on closed threads.
This commit is contained in:
parent
19847d4d42
commit
3de33348e4
1 changed files with 17 additions and 7 deletions
|
@ -604,7 +604,6 @@ void Scheduler::SwitchContextStep2() {
|
|||
|
||||
if (new_thread) {
|
||||
auto& cpu_core = system.ArmInterface(core_id);
|
||||
new_thread->context_guard.lock();
|
||||
cpu_core.Lock();
|
||||
ASSERT_MSG(new_thread->GetSchedulingStatus() == ThreadSchedStatus::Runnable,
|
||||
"Thread must be runnable.");
|
||||
|
@ -685,6 +684,16 @@ void Scheduler::OnSwitch(void* this_scheduler) {
|
|||
|
||||
void Scheduler::SwitchToCurrent() {
|
||||
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;
|
||||
if (current_thread != nullptr) {
|
||||
next_context = current_thread->GetHostContext();
|
||||
|
@ -694,6 +703,7 @@ void Scheduler::SwitchToCurrent() {
|
|||
Common::Fiber::YieldTo(switch_fiber, next_context);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Scheduler::UpdateLastContextSwitchTime(Thread* thread, Process* process) {
|
||||
const u64 prev_switch_ticks = last_context_switch_time;
|
||||
|
|
Loading…
Reference in a new issue