mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-03 16:39:01 -06: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:
		@@ -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();
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user