From 60a373a7862a85b8b030ea1b18d01d364ddf8a8b Mon Sep 17 00:00:00 2001
From: Subv <subv2112@gmail.com>
Date: Wed, 7 Jan 2015 10:10:58 -0500
Subject: Threads: Use a dummy idle thread when no other are ready.

This thread will not actually execute instructions, it will only advance the timing/events and try to yield immediately to the next ready thread, if there aren't any ready threads then it will be rescheduled and start its job again.
---
 src/core/core.cpp | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)

(limited to 'src/core/core.cpp')

diff --git a/src/core/core.cpp b/src/core/core.cpp
index 8ac4481ccb..98f8a7dffd 100644
--- a/src/core/core.cpp
+++ b/src/core/core.cpp
@@ -5,6 +5,7 @@
 #include "common/common_types.h"
 
 #include "core/core.h"
+#include "core/core_timing.h"
 
 #include "core/settings.h"
 #include "core/arm/disassembler/arm_disasm.h"
@@ -23,7 +24,17 @@ ARM_Interface*     g_sys_core = nullptr;  ///< ARM11 system (OS) core
 
 /// Run the core CPU loop
 void RunLoop(int tight_loop) {
-    g_app_core->Run(tight_loop);
+    // If the current thread is an idle thread, then don't execute instructions,
+    // instead advance to the next event and try to yield to the next thread
+    if (Kernel::IsIdleThread(Kernel::GetCurrentThreadHandle())) {
+        LOG_TRACE(Core_ARM11, "Idling");
+        CoreTiming::Idle();
+        CoreTiming::Advance();
+        HLE::Reschedule(__func__);
+    } else {
+        g_app_core->Run(tight_loop);
+    }
+
     HW::Update();
     if (HLE::g_reschedule) {
         Kernel::Reschedule();
-- 
cgit v1.2.3-70-g09d2