diff options
author | Subv <subv2112@gmail.com> | 2015-01-07 10:10:58 -0500 |
---|---|---|
committer | Subv <subv2112@gmail.com> | 2015-01-07 20:31:31 -0500 |
commit | 60a373a7862a85b8b030ea1b18d01d364ddf8a8b (patch) | |
tree | e9e6288406b16f2a8dd10236c96567a895af3410 /src/core/core.cpp | |
parent | b659cac2dc67ee97297049fcfb02c1ce186ffcb0 (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.cpp | 13 |
1 files changed, 12 insertions, 1 deletions
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(); |