mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 13:50:03 +00:00 
			
		
		
		
	Merge pull request #2410 from Subv/sleepthread
Don't yield execution in SleepThread(0) if there are no available threads to run
This commit is contained in:
		
						commit
						b5eac78b43
					
				
					 3 changed files with 14 additions and 0 deletions
				
			
		|  | @ -508,6 +508,10 @@ SharedPtr<Thread> SetupMainThread(u32 entry_point, s32 priority) { | |||
|     return thread; | ||||
| } | ||||
| 
 | ||||
| bool HaveReadyThreads() { | ||||
|     return ready_queue.get_first() != nullptr; | ||||
| } | ||||
| 
 | ||||
| void Reschedule() { | ||||
|     Thread* cur = GetCurrentThread(); | ||||
|     Thread* next = PopNextReadyThread(); | ||||
|  |  | |||
|  | @ -218,6 +218,11 @@ private: | |||
|  */ | ||||
| SharedPtr<Thread> SetupMainThread(u32 entry_point, s32 priority); | ||||
| 
 | ||||
| /**
 | ||||
|  * Returns whether there are any threads that are ready to run. | ||||
|  */ | ||||
| bool HaveReadyThreads(); | ||||
| 
 | ||||
| /**
 | ||||
|  * Reschedules to the next available thread (call after current thread is suspended) | ||||
|  */ | ||||
|  |  | |||
|  | @ -849,6 +849,11 @@ static ResultCode CancelTimer(Kernel::Handle handle) { | |||
| static void SleepThread(s64 nanoseconds) { | ||||
|     LOG_TRACE(Kernel_SVC, "called nanoseconds=%lld", nanoseconds); | ||||
| 
 | ||||
|     // Don't attempt to yield execution if there are no available threads to run,
 | ||||
|     // this way we avoid a useless reschedule to the idle thread.
 | ||||
|     if (nanoseconds == 0 && !Kernel::HaveReadyThreads()) | ||||
|         return; | ||||
| 
 | ||||
|     // Sleep current thread and check for next thread to schedule
 | ||||
|     Kernel::WaitCurrentThread_Sleep(); | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue