Skip to content

Commit f9b7526

Browse files
authored
Merge pull request #1875 from malucard/quitting
Fix quitting freeze
2 parents baad2c2 + 3446f9b commit f9b7526

File tree

3 files changed

+37
-27
lines changed

3 files changed

+37
-27
lines changed

.gitignore

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,10 @@ vsprojects/packages
4343
/modconv
4444
/ps1-packer
4545
/psyq-obj-parser
46-
/pcsx.json
47-
/memcard1.mcd
48-
/memcard2.mcd
4946

5047
# Temporary files from pcsx itself
5148
pcsx.json
49+
pcsx.json.tmp
5250
*.mcd
5351

5452
# FastBuild and msfastbuild stuff

src/gui/gui.cc

Lines changed: 29 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -892,28 +892,35 @@ void PCSX::GUI::close() {
892892

893893
void PCSX::GUI::saveCfg() {
894894
if (g_system->getArgs().isTestModeEnabled()) return;
895-
std::ofstream cfg(g_system->getPersistentDir() / "pcsx.json");
896-
json j;
897-
898-
if (m_fullscreen || glfwGetWindowAttrib(m_window, GLFW_ICONIFIED) > 0) {
899-
m_glfwPosX = settings.get<WindowPosX>();
900-
m_glfwPosY = settings.get<WindowPosY>();
901-
m_glfwSizeX = settings.get<WindowSizeX>();
902-
m_glfwSizeY = settings.get<WindowSizeY>();
903-
m_glfwMaximized = settings.get<WindowMaximized>();
904-
} else {
905-
glfwGetWindowPos(m_window, &m_glfwPosX, &m_glfwPosY);
906-
glfwGetWindowSize(m_window, &m_glfwSizeX, &m_glfwSizeY);
907-
m_glfwMaximized = glfwGetWindowAttrib(m_window, GLFW_MAXIMIZED) != 0;
908-
}
909-
910-
j["imgui"] = ImGui::SaveIniSettingsToMemory(nullptr);
911-
j["SPU"] = PCSX::g_emulator->m_spu->getCfg();
912-
j["emulator"] = PCSX::g_emulator->settings.serialize();
913-
j["gui"] = settings.serialize();
914-
j["loggers"] = m_log.serialize();
915-
j["pads"] = PCSX::g_emulator->m_pads->getCfg();
916-
cfg << std::setw(2) << j << std::endl;
895+
std::filesystem::path cfgTmpPath = g_system->getPersistentDir() / "pcsx.json.tmp";
896+
std::filesystem::path cfgPath = g_system->getPersistentDir() / "pcsx.json";
897+
{
898+
std::ofstream cfg(cfgTmpPath);
899+
json j;
900+
901+
if (m_fullscreen || glfwGetWindowAttrib(m_window, GLFW_ICONIFIED) > 0) {
902+
m_glfwPosX = settings.get<WindowPosX>();
903+
m_glfwPosY = settings.get<WindowPosY>();
904+
m_glfwSizeX = settings.get<WindowSizeX>();
905+
m_glfwSizeY = settings.get<WindowSizeY>();
906+
m_glfwMaximized = settings.get<WindowMaximized>();
907+
} else {
908+
glfwGetWindowPos(m_window, &m_glfwPosX, &m_glfwPosY);
909+
glfwGetWindowSize(m_window, &m_glfwSizeX, &m_glfwSizeY);
910+
m_glfwMaximized = glfwGetWindowAttrib(m_window, GLFW_MAXIMIZED) != 0;
911+
}
912+
913+
j["imgui"] = ImGui::SaveIniSettingsToMemory(nullptr);
914+
j["SPU"] = PCSX::g_emulator->m_spu->getCfg();
915+
j["emulator"] = PCSX::g_emulator->settings.serialize();
916+
j["gui"] = settings.serialize();
917+
j["loggers"] = m_log.serialize();
918+
j["pads"] = PCSX::g_emulator->m_pads->getCfg();
919+
cfg << std::setw(2) << j << std::endl;
920+
}
921+
if (std::filesystem::copy_file(cfgTmpPath, cfgPath, std::filesystem::copy_options::overwrite_existing)) {
922+
std::filesystem::remove(cfgTmpPath);
923+
}
917924
}
918925

919926
void PCSX::GUI::glfwKeyCallback(GLFWwindow* window, int key, int scancode, int action, int mods) {

src/main/main.cc

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -193,8 +193,9 @@ int pcsxMain(int argc, char **argv) {
193193
// enabled as much as possible.
194194
SystemImpl *system = new SystemImpl(args);
195195
PCSX::g_system = system;
196-
auto sigint = std::signal(SIGINT, [](auto signal) { PCSX::g_system->quit(-1); });
197-
auto sigterm = std::signal(SIGTERM, [](auto signal) { PCSX::g_system->quit(-1); });
196+
static std::atomic_bool scheduledQuit = false;
197+
auto sigint = std::signal(SIGINT, [](auto signal) { scheduledQuit = true; });
198+
auto sigterm = std::signal(SIGTERM, [](auto signal) { scheduledQuit = true; });
198199
#ifndef _WIN32
199200
signal(SIGPIPE, SIG_IGN);
200201
#endif
@@ -454,6 +455,10 @@ runner.init({
454455
// when the emulator is paused.
455456
s_ui->update();
456457
}
458+
if (scheduledQuit) {
459+
PCSX::g_system->quit(-1);
460+
return exitCode;
461+
}
457462
}
458463
} catch (...) {
459464
// This will ensure we don't do certain cleanups that are awaiting other tasks,

0 commit comments

Comments
 (0)