From 177d697a15fa27e35b4803e02b0dbc97a2862677 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 5 Jul 2020 10:37:44 +0200 Subject: [PATCH] Revert "Remove the I/O on Thread option - treat it as always on." This reverts commit 9c40381db090285aa7848bfee93dca6c4a220b62. --- Core/Config.cpp | 1 + Core/Config.h | 1 + Core/HLE/sceIo.cpp | 18 ++++++++++++------ UI/GameSettingsScreen.cpp | 2 ++ 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/Core/Config.cpp b/Core/Config.cpp index 8af00b96ac3e..df3bf415dc78 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -504,6 +504,7 @@ static bool DefaultSasThread() { static ConfigSetting cpuSettings[] = { ReportedConfigSetting("CPUCore", &g_Config.iCpuCore, &DefaultCpuCore, true, true), ReportedConfigSetting("SeparateSASThread", &g_Config.bSeparateSASThread, &DefaultSasThread, true, true), + ReportedConfigSetting("SeparateIOThread", &g_Config.bSeparateIOThread, true, true, true), ReportedConfigSetting("IOTimingMethod", &g_Config.iIOTimingMethod, IOTIMING_FAST, true, true), ConfigSetting("FastMemoryAccess", &g_Config.bFastMemory, true, true, true), ReportedConfigSetting("FuncReplacements", &g_Config.bFuncReplacements, true, true, true), diff --git a/Core/Config.h b/Core/Config.h index 084eacc942b8..2e5cea51c91a 100644 --- a/Core/Config.h +++ b/Core/Config.h @@ -108,6 +108,7 @@ struct Config { uint32_t uJitDisableFlags; bool bSeparateSASThread; + bool bSeparateIOThread; int iIOTimingMethod; int iLockedCPUSpeed; bool bAutoSaveSymbolMap; diff --git a/Core/HLE/sceIo.cpp b/Core/HLE/sceIo.cpp index 9f3cf81f7837..7865d4cea530 100644 --- a/Core/HLE/sceIo.cpp +++ b/Core/HLE/sceIo.cpp @@ -129,7 +129,7 @@ static MemStickFatState lastMemStickFatState; static AsyncIOManager ioManager; static bool ioManagerThreadEnabled = false; -static std::thread ioManagerThread; +static std::thread *ioManagerThread; // TODO: Is it better to just put all on the thread? // Let's try. (was 256) @@ -649,10 +649,12 @@ void __IoInit() { memset(fds, 0, sizeof(fds)); - ioManagerThreadEnabled = true; + ioManagerThreadEnabled = g_Config.bSeparateIOThread; ioManager.SetThreadEnabled(ioManagerThreadEnabled); - Core_ListenLifecycle(&__IoWakeManager); - ioManagerThread = std::thread(&__IoManagerThread); + if (ioManagerThreadEnabled) { + Core_ListenLifecycle(&__IoWakeManager); + ioManagerThread = new std::thread(&__IoManagerThread); + } __KernelRegisterWaitTypeFuncs(WAITTYPE_ASYNCIO, __IoAsyncBeginCallback, __IoAsyncEndCallback); @@ -733,8 +735,12 @@ void __IoShutdown() { ioManagerThreadEnabled = false; ioManager.SyncThread(); ioManager.FinishEventLoop(); - ioManagerThread.join(); - ioManager.Shutdown(); + if (ioManagerThread != nullptr) { + ioManagerThread->join(); + delete ioManagerThread; + ioManagerThread = nullptr; + ioManager.Shutdown(); + } for (int i = 0; i < PSP_COUNT_FDS; ++i) { asyncParams[i].op = IoAsyncOp::NONE; diff --git a/UI/GameSettingsScreen.cpp b/UI/GameSettingsScreen.cpp index 1a9ca4a977de..9d824e28b3b7 100644 --- a/UI/GameSettingsScreen.cpp +++ b/UI/GameSettingsScreen.cpp @@ -771,8 +771,10 @@ void GameSettingsScreen::CreateViews() { systemSettings->Add(new CheckBox(&g_Config.bFastMemory, sy->T("Fast Memory", "Fast Memory (Unstable)")))->OnClick.Handle(this, &GameSettingsScreen::OnJitAffectingSetting); + systemSettings->Add(new CheckBox(&g_Config.bSeparateIOThread, sy->T("I/O on thread (experimental)")))->SetEnabled(!PSP_IsInited()); static const char *ioTimingMethods[] = { "Fast (lag on slow storage)", "Host (bugs, less lag)", "Simulate UMD delays" }; View *ioTimingMethod = systemSettings->Add(new PopupMultiChoice(&g_Config.iIOTimingMethod, sy->T("IO timing method"), ioTimingMethods, 0, ARRAY_SIZE(ioTimingMethods), sy->GetName(), screenManager())); + ioTimingMethod->SetEnabledPtr(&g_Config.bSeparateIOThread); systemSettings->Add(new CheckBox(&g_Config.bForceLagSync, sy->T("Force real clock sync (slower, less lag)"))); PopupSliderChoice *lockedMhz = systemSettings->Add(new PopupSliderChoice(&g_Config.iLockedCPUSpeed, 0, 1000, sy->T("Change CPU Clock", "Change CPU Clock (unstable)"), screenManager(), sy->T("MHz, 0:default"))); lockedMhz->OnChange.Add([&](UI::EventParams &) {