Kaynağa Gözat

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.
Lioncash 7 yıl önce
ebeveyn
işleme
c892cf01fa

+ 2 - 4
src/core/hle/kernel/scheduler.cpp

@@ -199,8 +199,7 @@ void Scheduler::YieldWithoutLoadBalancing(Thread* thread) {
     ASSERT(thread->GetPriority() < THREADPRIO_COUNT);
     ASSERT(thread->GetPriority() < THREADPRIO_COUNT);
 
 
     // Yield this thread -- sleep for zero time and force reschedule to different thread
     // 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) {
 void Scheduler::YieldWithLoadBalancing(Thread* thread) {
@@ -215,8 +214,7 @@ void Scheduler::YieldWithLoadBalancing(Thread* thread) {
     ASSERT(priority < THREADPRIO_COUNT);
     ASSERT(priority < THREADPRIO_COUNT);
 
 
     // Sleep for zero time to be able to force reschedule to different thread
     // 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;
     Thread* suggested_thread = nullptr;
 
 

+ 11 - 11
src/core/hle/kernel/svc.cpp

@@ -1300,32 +1300,32 @@ static void SleepThread(s64 nanoseconds) {
         YieldAndWaitForLoadBalancing = -2,
         YieldAndWaitForLoadBalancing = -2,
     };
     };
 
 
+    auto& system = Core::System::GetInstance();
+    auto& scheduler = system.CurrentScheduler();
+    auto* const current_thread = scheduler.GetCurrentThread();
+
     if (nanoseconds <= 0) {
     if (nanoseconds <= 0) {
-        auto& scheduler{Core::System::GetInstance().CurrentScheduler()};
         switch (static_cast<SleepType>(nanoseconds)) {
         switch (static_cast<SleepType>(nanoseconds)) {
         case SleepType::YieldWithoutLoadBalancing:
         case SleepType::YieldWithoutLoadBalancing:
-            scheduler.YieldWithoutLoadBalancing(GetCurrentThread());
+            scheduler.YieldWithoutLoadBalancing(current_thread);
             break;
             break;
         case SleepType::YieldWithLoadBalancing:
         case SleepType::YieldWithLoadBalancing:
-            scheduler.YieldWithLoadBalancing(GetCurrentThread());
+            scheduler.YieldWithLoadBalancing(current_thread);
             break;
             break;
         case SleepType::YieldAndWaitForLoadBalancing:
         case SleepType::YieldAndWaitForLoadBalancing:
-            scheduler.YieldAndWaitForLoadBalancing(GetCurrentThread());
+            scheduler.YieldAndWaitForLoadBalancing(current_thread);
             break;
             break;
         default:
         default:
             UNREACHABLE_MSG("Unimplemented sleep yield type '{:016X}'!", nanoseconds);
             UNREACHABLE_MSG("Unimplemented sleep yield type '{:016X}'!", nanoseconds);
         }
         }
     } else {
     } 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
     // 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
 /// Wait process wide key atomic

+ 8 - 5
src/core/hle/kernel/thread.cpp

@@ -68,11 +68,6 @@ void Thread::Stop() {
     owner_process->FreeTLSSlot(tls_address);
     owner_process->FreeTLSSlot(tls_address);
 }
 }
 
 
-void WaitCurrentThread_Sleep() {
-    Thread* thread = GetCurrentThread();
-    thread->SetStatus(ThreadStatus::WaitSleep);
-}
-
 void ExitCurrentThread() {
 void ExitCurrentThread() {
     Thread* thread = GetCurrentThread();
     Thread* thread = GetCurrentThread();
     thread->Stop();
     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);
+}
+
 ////////////////////////////////////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////////////////////////////////////
 
 
 /**
 /**

+ 3 - 5
src/core/hle/kernel/thread.h

@@ -383,6 +383,9 @@ public:
 
 
     void SetActivity(ThreadActivity value);
     void SetActivity(ThreadActivity value);
 
 
+    /// Sleeps this thread for the given amount of nanoseconds.
+    void Sleep(s64 nanoseconds);
+
 private:
 private:
     explicit Thread(KernelCore& kernel);
     explicit Thread(KernelCore& kernel);
     ~Thread() override;
     ~Thread() override;
@@ -460,11 +463,6 @@ private:
  */
  */
 Thread* GetCurrentThread();
 Thread* GetCurrentThread();
 
 
-/**
- * Waits the current thread on a sleep
- */
-void WaitCurrentThread_Sleep();
-
 /**
 /**
  * Stops the current thread and removes it from the thread_list
  * Stops the current thread and removes it from the thread_list
  */
  */