| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- // Copyright 2014 Citra Emulator Project
- // Licensed under GPLv2 or any later version
- // Refer to the license.txt file included.
- #include "common/assert.h"
- #include "common/logging/log.h"
- #include "core/arm/arm_interface.h"
- #include "core/core.h"
- #include "core/hle/hle.h"
- #include "core/hle/service/service.h"
- ////////////////////////////////////////////////////////////////////////////////////////////////////
- namespace {
- bool reschedule; ///< If true, immediately reschedules the CPU to a new thread
- }
- namespace HLE {
- void Reschedule(const char* reason) {
- DEBUG_ASSERT_MSG(reason != nullptr && strlen(reason) < 256,
- "Reschedule: Invalid or too long reason.");
- // TODO(bunnei): It seems that games depend on some CPU execution time elapsing during HLE
- // routines. This simulates that time by artificially advancing the number of CPU "ticks".
- // The value was chosen empirically, it seems to work well enough for everything tested, but
- // is likely not ideal. We should find a more accurate way to simulate timing with HLE.
- Core::AppCore().AddTicks(4000);
- Core::AppCore().PrepareReschedule();
- reschedule = true;
- }
- bool IsReschedulePending() {
- return reschedule;
- }
- void DoneRescheduling() {
- reschedule = false;
- }
- void Init() {
- Service::Init();
- reschedule = false;
- LOG_DEBUG(Kernel, "initialized OK");
- }
- void Shutdown() {
- Service::Shutdown();
- LOG_DEBUG(Kernel, "shutdown OK");
- }
- } // namespace
|