kernel/thread: Migrate WaitCurrentThread_Sleep into the Thread interface
Rather than make a global accessor for this sort of thing. We can make it a part of the thread interface itself. This allows getting rid of a hidden global accessor in the kernel code.
This commit is contained in:
		@@ -199,8 +199,7 @@ void Scheduler::YieldWithoutLoadBalancing(Thread* thread) {
 | 
			
		||||
    ASSERT(thread->GetPriority() < THREADPRIO_COUNT);
 | 
			
		||||
 | 
			
		||||
    // Yield this thread -- sleep for zero time and force reschedule to different thread
 | 
			
		||||
    WaitCurrentThread_Sleep();
 | 
			
		||||
    GetCurrentThread()->WakeAfterDelay(0);
 | 
			
		||||
    GetCurrentThread()->Sleep(0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Scheduler::YieldWithLoadBalancing(Thread* thread) {
 | 
			
		||||
@@ -215,8 +214,7 @@ void Scheduler::YieldWithLoadBalancing(Thread* thread) {
 | 
			
		||||
    ASSERT(priority < THREADPRIO_COUNT);
 | 
			
		||||
 | 
			
		||||
    // Sleep for zero time to be able to force reschedule to different thread
 | 
			
		||||
    WaitCurrentThread_Sleep();
 | 
			
		||||
    GetCurrentThread()->WakeAfterDelay(0);
 | 
			
		||||
    GetCurrentThread()->Sleep(0);
 | 
			
		||||
 | 
			
		||||
    Thread* suggested_thread = nullptr;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1300,32 +1300,32 @@ static void SleepThread(s64 nanoseconds) {
 | 
			
		||||
        YieldAndWaitForLoadBalancing = -2,
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    auto& system = Core::System::GetInstance();
 | 
			
		||||
    auto& scheduler = system.CurrentScheduler();
 | 
			
		||||
    auto* const current_thread = scheduler.GetCurrentThread();
 | 
			
		||||
 | 
			
		||||
    if (nanoseconds <= 0) {
 | 
			
		||||
        auto& scheduler{Core::System::GetInstance().CurrentScheduler()};
 | 
			
		||||
        switch (static_cast<SleepType>(nanoseconds)) {
 | 
			
		||||
        case SleepType::YieldWithoutLoadBalancing:
 | 
			
		||||
            scheduler.YieldWithoutLoadBalancing(GetCurrentThread());
 | 
			
		||||
            scheduler.YieldWithoutLoadBalancing(current_thread);
 | 
			
		||||
            break;
 | 
			
		||||
        case SleepType::YieldWithLoadBalancing:
 | 
			
		||||
            scheduler.YieldWithLoadBalancing(GetCurrentThread());
 | 
			
		||||
            scheduler.YieldWithLoadBalancing(current_thread);
 | 
			
		||||
            break;
 | 
			
		||||
        case SleepType::YieldAndWaitForLoadBalancing:
 | 
			
		||||
            scheduler.YieldAndWaitForLoadBalancing(GetCurrentThread());
 | 
			
		||||
            scheduler.YieldAndWaitForLoadBalancing(current_thread);
 | 
			
		||||
            break;
 | 
			
		||||
        default:
 | 
			
		||||
            UNREACHABLE_MSG("Unimplemented sleep yield type '{:016X}'!", nanoseconds);
 | 
			
		||||
        }
 | 
			
		||||
    } else {
 | 
			
		||||
        // Sleep current thread and check for next thread to schedule
 | 
			
		||||
        WaitCurrentThread_Sleep();
 | 
			
		||||
 | 
			
		||||
        // Create an event to wake the thread up after the specified nanosecond delay has passed
 | 
			
		||||
        GetCurrentThread()->WakeAfterDelay(nanoseconds);
 | 
			
		||||
        current_thread->Sleep(nanoseconds);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Reschedule all CPU cores
 | 
			
		||||
    for (std::size_t i = 0; i < Core::NUM_CPU_CORES; ++i)
 | 
			
		||||
        Core::System::GetInstance().CpuCore(i).PrepareReschedule();
 | 
			
		||||
    for (std::size_t i = 0; i < Core::NUM_CPU_CORES; ++i) {
 | 
			
		||||
        system.CpuCore(i).PrepareReschedule();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Wait process wide key atomic
 | 
			
		||||
 
 | 
			
		||||
@@ -68,11 +68,6 @@ void Thread::Stop() {
 | 
			
		||||
    owner_process->FreeTLSSlot(tls_address);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void WaitCurrentThread_Sleep() {
 | 
			
		||||
    Thread* thread = GetCurrentThread();
 | 
			
		||||
    thread->SetStatus(ThreadStatus::WaitSleep);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ExitCurrentThread() {
 | 
			
		||||
    Thread* thread = GetCurrentThread();
 | 
			
		||||
    thread->Stop();
 | 
			
		||||
@@ -391,6 +386,14 @@ void Thread::SetActivity(ThreadActivity value) {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Thread::Sleep(s64 nanoseconds) {
 | 
			
		||||
    // Sleep current thread and check for next thread to schedule
 | 
			
		||||
    SetStatus(ThreadStatus::WaitSleep);
 | 
			
		||||
 | 
			
		||||
    // Create an event to wake the thread up after the specified nanosecond delay has passed
 | 
			
		||||
    WakeAfterDelay(nanoseconds);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 
 | 
			
		||||
@@ -383,6 +383,9 @@ public:
 | 
			
		||||
 | 
			
		||||
    void SetActivity(ThreadActivity value);
 | 
			
		||||
 | 
			
		||||
    /// Sleeps this thread for the given amount of nanoseconds.
 | 
			
		||||
    void Sleep(s64 nanoseconds);
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    explicit Thread(KernelCore& kernel);
 | 
			
		||||
    ~Thread() override;
 | 
			
		||||
@@ -460,11 +463,6 @@ private:
 | 
			
		||||
 */
 | 
			
		||||
Thread* GetCurrentThread();
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Waits the current thread on a sleep
 | 
			
		||||
 */
 | 
			
		||||
void WaitCurrentThread_Sleep();
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Stops the current thread and removes it from the thread_list
 | 
			
		||||
 */
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user