Always use 1 thread while using interpreter mode

Interpreter mode (as opposed to the regular speedy recompiler mode) is expected to be primarily used for debugging, and thus should be used with one core. However, unlike the game profile option, the `--force-interpreter` launch parameter didn't limit the amount of cores used to 1. This commit fixes that issue, alongside an additional temporary fix that helps situations where a debugger trap instruction gets hit by two threads simultaneously. Eventually this should be replaced with a more advanced approach that'd freeze other threads while stepping.
This commit is contained in:
Crementif 2025-01-05 03:41:25 +01:00
parent 4b792aa4d2
commit 1481baa587
2 changed files with 3 additions and 2 deletions

View file

@ -9,6 +9,7 @@
#include "audio/IAudioAPI.h" #include "audio/IAudioAPI.h"
#include "audio/IAudioInputAPI.h" #include "audio/IAudioInputAPI.h"
#include "config/ActiveSettings.h" #include "config/ActiveSettings.h"
#include "config/LaunchSettings.h"
#include "Cafe/TitleList/GameInfo.h" #include "Cafe/TitleList/GameInfo.h"
#include "Cafe/GraphicPack/GraphicPack2.h" #include "Cafe/GraphicPack/GraphicPack2.h"
#include "util/helpers/SystemException.h" #include "util/helpers/SystemException.h"
@ -843,7 +844,7 @@ namespace CafeSystem
module->TitleStart(); module->TitleStart();
cemu_initForGame(); cemu_initForGame();
// enter scheduler // enter scheduler
if (ActiveSettings::GetCPUMode() == CPUMode::MulticoreRecompiler) if (ActiveSettings::GetCPUMode() == CPUMode::MulticoreRecompiler && !LaunchSettings::ForceInterpreter())
coreinit::OSSchedulerBegin(3); coreinit::OSSchedulerBegin(3);
else else
coreinit::OSSchedulerBegin(1); coreinit::OSSchedulerBegin(1);

View file

@ -575,7 +575,7 @@ void debugger_enterTW(PPCInterpreter_t* hCPU)
debuggerState.debugSession.stepInto = false; debuggerState.debugSession.stepInto = false;
debuggerState.debugSession.stepOver = false; debuggerState.debugSession.stepOver = false;
debuggerState.debugSession.run = false; debuggerState.debugSession.run = false;
while (true) while (debuggerState.debugSession.isTrapped)
{ {
std::this_thread::sleep_for(std::chrono::milliseconds(1)); std::this_thread::sleep_for(std::chrono::milliseconds(1));
// check for step commands // check for step commands