kernel: scheduler: Minor cleanup to remove duplicated code.
This commit is contained in:
		
							parent
							
								
									b7ef581c6e
								
							
						
					
					
						commit
						4b9e1b6586
					
				| @ -618,8 +618,7 @@ void Scheduler::OnThreadStart() { | |||||||
|     SwitchContextStep2(); |     SwitchContextStep2(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Scheduler::Unload() { | void Scheduler::Unload(Thread* thread) { | ||||||
|     Thread* thread = current_thread.get(); |  | ||||||
|     if (thread) { |     if (thread) { | ||||||
|         thread->last_running_ticks = system.CoreTiming().GetCPUTicks(); |         thread->last_running_ticks = system.CoreTiming().GetCPUTicks(); | ||||||
|         thread->SetIsRunning(false); |         thread->SetIsRunning(false); | ||||||
| @ -639,8 +638,11 @@ void Scheduler::Unload() { | |||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Scheduler::Reload() { | void Scheduler::Unload() { | ||||||
|     Thread* thread = current_thread.get(); |     Unload(current_thread.get()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void Scheduler::Reload(Thread* thread) { | ||||||
|     if (thread) { |     if (thread) { | ||||||
|         ASSERT_MSG(thread->GetSchedulingStatus() == ThreadSchedStatus::Runnable, |         ASSERT_MSG(thread->GetSchedulingStatus() == ThreadSchedStatus::Runnable, | ||||||
|                    "Thread must be runnable."); |                    "Thread must be runnable."); | ||||||
| @ -665,30 +667,13 @@ void Scheduler::Reload() { | |||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void Scheduler::Reload() { | ||||||
|  |     Reload(current_thread.get()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void Scheduler::SwitchContextStep2() { | void Scheduler::SwitchContextStep2() { | ||||||
|     // Load context of new thread
 |     // Load context of new thread
 | ||||||
|     if (selected_thread) { |     Reload(selected_thread.get()); | ||||||
|         ASSERT_MSG(selected_thread->GetSchedulingStatus() == ThreadSchedStatus::Runnable, |  | ||||||
|                    "Thread must be runnable."); |  | ||||||
| 
 |  | ||||||
|         // Cancel any outstanding wakeup events for this thread
 |  | ||||||
|         selected_thread->SetIsRunning(true); |  | ||||||
|         selected_thread->last_running_ticks = system.CoreTiming().GetCPUTicks(); |  | ||||||
|         selected_thread->SetWasRunning(false); |  | ||||||
| 
 |  | ||||||
|         auto* const thread_owner_process = current_thread->GetOwnerProcess(); |  | ||||||
|         if (thread_owner_process != nullptr) { |  | ||||||
|             system.Kernel().MakeCurrentProcess(thread_owner_process); |  | ||||||
|         } |  | ||||||
|         if (!selected_thread->IsHLEThread()) { |  | ||||||
|             Core::ARM_Interface& cpu_core = system.ArmInterface(core_id); |  | ||||||
|             cpu_core.LoadContext(selected_thread->GetContext32()); |  | ||||||
|             cpu_core.LoadContext(selected_thread->GetContext64()); |  | ||||||
|             cpu_core.SetTlsAddress(selected_thread->GetTLSAddress()); |  | ||||||
|             cpu_core.SetTPIDR_EL0(selected_thread->GetTPIDR_EL0()); |  | ||||||
|             cpu_core.ClearExclusiveState(); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 | 
 | ||||||
|     TryDoContextSwitch(); |     TryDoContextSwitch(); | ||||||
| } | } | ||||||
| @ -712,26 +697,7 @@ void Scheduler::SwitchContext() { | |||||||
|     UpdateLastContextSwitchTime(previous_thread, previous_process); |     UpdateLastContextSwitchTime(previous_thread, previous_process); | ||||||
| 
 | 
 | ||||||
|     // Save context for previous thread
 |     // Save context for previous thread
 | ||||||
|     if (previous_thread) { |     Unload(previous_thread); | ||||||
|         if (new_thread != nullptr && new_thread->IsSuspendThread()) { |  | ||||||
|             previous_thread->SetWasRunning(true); |  | ||||||
|         } |  | ||||||
|         previous_thread->last_running_ticks = system.CoreTiming().GetCPUTicks(); |  | ||||||
|         previous_thread->SetIsRunning(false); |  | ||||||
|         if (previous_thread->IsContinuousOnSVC() && !previous_thread->IsHLEThread()) { |  | ||||||
|             system.ArmInterface(core_id).ExceptionalExit(); |  | ||||||
|             previous_thread->SetContinuousOnSVC(false); |  | ||||||
|         } |  | ||||||
|         if (!previous_thread->IsHLEThread() && !previous_thread->HasExited()) { |  | ||||||
|             Core::ARM_Interface& cpu_core = system.ArmInterface(core_id); |  | ||||||
|             cpu_core.SaveContext(previous_thread->GetContext32()); |  | ||||||
|             cpu_core.SaveContext(previous_thread->GetContext64()); |  | ||||||
|             // Save the TPIDR_EL0 system register in case it was modified.
 |  | ||||||
|             previous_thread->SetTPIDR_EL0(cpu_core.GetTPIDR_EL0()); |  | ||||||
|             cpu_core.ClearExclusiveState(); |  | ||||||
|         } |  | ||||||
|         previous_thread->context_guard.unlock(); |  | ||||||
|     } |  | ||||||
| 
 | 
 | ||||||
|     std::shared_ptr<Common::Fiber>* old_context; |     std::shared_ptr<Common::Fiber>* old_context; | ||||||
|     if (previous_thread != nullptr) { |     if (previous_thread != nullptr) { | ||||||
|  | |||||||
| @ -212,8 +212,10 @@ public: | |||||||
| 
 | 
 | ||||||
|     /// The next two are for SingleCore Only.
 |     /// The next two are for SingleCore Only.
 | ||||||
|     /// Unload current thread before preempting core.
 |     /// Unload current thread before preempting core.
 | ||||||
|  |     void Unload(Thread* thread); | ||||||
|     void Unload(); |     void Unload(); | ||||||
|     /// Reload current thread after core preemption.
 |     /// Reload current thread after core preemption.
 | ||||||
|  |     void Reload(Thread* thread); | ||||||
|     void Reload(); |     void Reload(); | ||||||
| 
 | 
 | ||||||
|     /// Gets the current running thread
 |     /// Gets the current running thread
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 bunnei
						bunnei