Scheduler: Protect on closed threads.
This commit is contained in:
		@@ -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,13 +684,24 @@ void Scheduler::OnSwitch(void* this_scheduler) {
 | 
			
		||||
 | 
			
		||||
void Scheduler::SwitchToCurrent() {
 | 
			
		||||
    while (true) {
 | 
			
		||||
        std::shared_ptr<Common::Fiber> next_context;
 | 
			
		||||
        if (current_thread != nullptr) {
 | 
			
		||||
            next_context = current_thread->GetHostContext();
 | 
			
		||||
        } else {
 | 
			
		||||
            next_context = idle_thread->GetHostContext();
 | 
			
		||||
        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();
 | 
			
		||||
            } else {
 | 
			
		||||
                next_context = idle_thread->GetHostContext();
 | 
			
		||||
            }
 | 
			
		||||
            Common::Fiber::YieldTo(switch_fiber, next_context);
 | 
			
		||||
        }
 | 
			
		||||
        Common::Fiber::YieldTo(switch_fiber, next_context);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user