mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-10-29 23:19:01 -05:00 
			
		
		
		
	kernel/thread: Deduplicate scheduler switching code
The code in both places was the same verbatim, so we can extract it to a function to deduplicate the logic.
This commit is contained in:
		| @@ -142,36 +142,7 @@ void Thread::ResumeFromWait() { | ||||
|  | ||||
|     status = ThreadStatus::Ready; | ||||
|  | ||||
|     std::optional<s32> new_processor_id = GetNextProcessorId(affinity_mask); | ||||
|     if (!new_processor_id) { | ||||
|         new_processor_id = processor_id; | ||||
|     } | ||||
|     if (ideal_core != -1 && | ||||
|         Core::System::GetInstance().Scheduler(ideal_core).GetCurrentThread() == nullptr) { | ||||
|         new_processor_id = ideal_core; | ||||
|     } | ||||
|  | ||||
|     ASSERT(*new_processor_id < 4); | ||||
|  | ||||
|     // Add thread to new core's scheduler | ||||
|     auto* next_scheduler = &Core::System::GetInstance().Scheduler(*new_processor_id); | ||||
|  | ||||
|     if (*new_processor_id != processor_id) { | ||||
|         // Remove thread from previous core's scheduler | ||||
|         scheduler->RemoveThread(this); | ||||
|         next_scheduler->AddThread(this, current_priority); | ||||
|     } | ||||
|  | ||||
|     processor_id = *new_processor_id; | ||||
|  | ||||
|     // If the thread was ready, unschedule from the previous core and schedule on the new core | ||||
|     scheduler->UnscheduleThread(this, current_priority); | ||||
|     next_scheduler->ScheduleThread(this, current_priority); | ||||
|  | ||||
|     // Change thread's scheduler | ||||
|     scheduler = next_scheduler; | ||||
|  | ||||
|     Core::System::GetInstance().CpuCore(processor_id).PrepareReschedule(); | ||||
|     ChangeScheduler(); | ||||
| } | ||||
|  | ||||
| /** | ||||
| @@ -364,42 +335,45 @@ void Thread::UpdatePriority() { | ||||
| void Thread::ChangeCore(u32 core, u64 mask) { | ||||
|     ideal_core = core; | ||||
|     affinity_mask = mask; | ||||
|     ChangeScheduler(); | ||||
| } | ||||
|  | ||||
| void Thread::ChangeScheduler() { | ||||
|     if (status != ThreadStatus::Ready) { | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     auto& system = Core::System::GetInstance(); | ||||
|     std::optional<s32> new_processor_id{GetNextProcessorId(affinity_mask)}; | ||||
|  | ||||
|     if (!new_processor_id) { | ||||
|         new_processor_id = processor_id; | ||||
|     } | ||||
|     if (ideal_core != -1 && | ||||
|         Core::System::GetInstance().Scheduler(ideal_core).GetCurrentThread() == nullptr) { | ||||
|     if (ideal_core != -1 && system.Scheduler(ideal_core).GetCurrentThread() == nullptr) { | ||||
|         new_processor_id = ideal_core; | ||||
|     } | ||||
|  | ||||
|     ASSERT(*new_processor_id < 4); | ||||
|  | ||||
|     // Add thread to new core's scheduler | ||||
|     auto* next_scheduler = &Core::System::GetInstance().Scheduler(*new_processor_id); | ||||
|     auto& next_scheduler = system.Scheduler(*new_processor_id); | ||||
|  | ||||
|     if (*new_processor_id != processor_id) { | ||||
|         // Remove thread from previous core's scheduler | ||||
|         scheduler->RemoveThread(this); | ||||
|         next_scheduler->AddThread(this, current_priority); | ||||
|         next_scheduler.AddThread(this, current_priority); | ||||
|     } | ||||
|  | ||||
|     processor_id = *new_processor_id; | ||||
|  | ||||
|     // If the thread was ready, unschedule from the previous core and schedule on the new core | ||||
|     scheduler->UnscheduleThread(this, current_priority); | ||||
|     next_scheduler->ScheduleThread(this, current_priority); | ||||
|     next_scheduler.ScheduleThread(this, current_priority); | ||||
|  | ||||
|     // Change thread's scheduler | ||||
|     scheduler = next_scheduler; | ||||
|     scheduler = &next_scheduler; | ||||
|  | ||||
|     Core::System::GetInstance().CpuCore(processor_id).PrepareReschedule(); | ||||
|     system.CpuCore(processor_id).PrepareReschedule(); | ||||
| } | ||||
|  | ||||
| bool Thread::AllWaitObjectsReady() { | ||||
|   | ||||
| @@ -374,6 +374,8 @@ private: | ||||
|     explicit Thread(KernelCore& kernel); | ||||
|     ~Thread() override; | ||||
|  | ||||
|     void ChangeScheduler(); | ||||
|  | ||||
|     Core::ARM_Interface::ThreadContext context{}; | ||||
|  | ||||
|     u32 thread_id = 0; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Lioncash
					Lioncash