aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/core.cpp
diff options
context:
space:
mode:
authorGravatar Subv <subv2112@gmail.com>2015-01-07 10:10:58 -0500
committerGravatar Subv <subv2112@gmail.com>2015-01-07 20:31:31 -0500
commit60a373a7862a85b8b030ea1b18d01d364ddf8a8b (patch)
treee9e6288406b16f2a8dd10236c96567a895af3410 /src/core/core.cpp
parentb659cac2dc67ee97297049fcfb02c1ce186ffcb0 (diff)
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.
Diffstat (limited to 'src/core/core.cpp')
-rw-r--r--src/core/core.cpp13
1 files changed, 12 insertions, 1 deletions
diff --git a/src/core/core.cpp b/src/core/core.cpp
index 8ac4481c..98f8a7df 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();