mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu.git
				synced 2025-05-12 00:45:25 +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
					
				@ -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…
	
		Reference in New Issue
	
	Block a user