mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-10-31 07:59:02 -05:00 
			
		
		
		
	Add PrepareReschedule where required.
This commit is contained in:
		 Fernando Sahmkow
					Fernando Sahmkow
				
			
				
					committed by
					
						 FernandoS27
						FernandoS27
					
				
			
			
				
	
			
			
			 FernandoS27
						FernandoS27
					
				
			
						parent
						
							b8b7ebcece
						
					
				
				
					commit
					b5d1e44782
				
			| @@ -22,6 +22,8 @@ namespace Kernel { | ||||
| namespace { | ||||
| // Wake up num_to_wake (or all) threads in a vector. | ||||
| void WakeThreads(const std::vector<SharedPtr<Thread>>& waiting_threads, s32 num_to_wake) { | ||||
|  | ||||
|     auto& system = Core::System::GetInstance(); | ||||
|     // Only process up to 'target' threads, unless 'target' is <= 0, in which case process | ||||
|     // them all. | ||||
|     std::size_t last = waiting_threads.size(); | ||||
| @@ -35,6 +37,8 @@ void WakeThreads(const std::vector<SharedPtr<Thread>>& waiting_threads, s32 num_ | ||||
|         waiting_threads[i]->SetWaitSynchronizationResult(RESULT_SUCCESS); | ||||
|         waiting_threads[i]->SetArbiterWaitAddress(0); | ||||
|         waiting_threads[i]->ResumeFromWait(); | ||||
|         if (waiting_threads[i]->GetProcessorID() >= 0) | ||||
|             system.CpuCore(waiting_threads[i]->GetProcessorID()).PrepareReschedule(); | ||||
|     } | ||||
| } | ||||
| } // Anonymous namespace | ||||
| @@ -174,25 +178,17 @@ ResultCode AddressArbiter::WaitForAddressImpl(VAddr address, s64 timeout) { | ||||
| } | ||||
|  | ||||
| std::vector<SharedPtr<Thread>> AddressArbiter::GetThreadsWaitingOnAddress(VAddr address) const { | ||||
|     const auto RetrieveWaitingThreads = [this](std::size_t core_index, | ||||
|                                                std::vector<SharedPtr<Thread>>& waiting_threads, | ||||
|                                                VAddr arb_addr) { | ||||
|         const auto& scheduler = system.Scheduler(core_index); | ||||
|         const auto& thread_list = scheduler.GetThreadList(); | ||||
|  | ||||
|         for (const auto& thread : thread_list) { | ||||
|             if (thread->GetArbiterWaitAddress() == arb_addr) { | ||||
|                 waiting_threads.push_back(thread); | ||||
|             } | ||||
|         } | ||||
|     }; | ||||
|  | ||||
|     // Retrieve all threads that are waiting for this address. | ||||
|     std::vector<SharedPtr<Thread>> threads; | ||||
|     RetrieveWaitingThreads(0, threads, address); | ||||
|     RetrieveWaitingThreads(1, threads, address); | ||||
|     RetrieveWaitingThreads(2, threads, address); | ||||
|     RetrieveWaitingThreads(3, threads, address); | ||||
|     const auto& scheduler = system.GlobalScheduler(); | ||||
|     const auto& thread_list = scheduler.GetThreadList(); | ||||
|  | ||||
|     for (const auto& thread : thread_list) { | ||||
|         if (thread->GetArbiterWaitAddress() == address) { | ||||
|             threads.push_back(thread); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // Sort them by priority, such that the highest priority ones come first. | ||||
|     std::sort(threads.begin(), threads.end(), | ||||
|   | ||||
| @@ -140,6 +140,8 @@ ResultCode Mutex::Release(VAddr address) { | ||||
|     thread->SetMutexWaitAddress(0); | ||||
|     thread->SetWaitHandle(0); | ||||
|  | ||||
|     Core::System::GetInstance().PrepareReschedule(); | ||||
|  | ||||
|     return RESULT_SUCCESS; | ||||
| } | ||||
| } // namespace Kernel | ||||
|   | ||||
| @@ -6,6 +6,8 @@ | ||||
| #include "common/assert.h" | ||||
| #include "common/common_types.h" | ||||
| #include "common/logging/log.h" | ||||
| #include "core/core.h" | ||||
| #include "core/core_cpu.h" | ||||
| #include "core/hle/kernel/object.h" | ||||
| #include "core/hle/kernel/process.h" | ||||
| #include "core/hle/kernel/thread.h" | ||||
| @@ -95,6 +97,8 @@ void WaitObject::WakeupWaitingThread(SharedPtr<Thread> thread) { | ||||
|     } | ||||
|     if (resume) { | ||||
|         thread->ResumeFromWait(); | ||||
|         if (thread->GetProcessorID() >= 0) | ||||
|             Core::System::GetInstance().CpuCore(thread->GetProcessorID()).PrepareReschedule(); | ||||
|     } | ||||
| } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user