Skip to content

Commit fa30d3c

Browse files
authored
linux: fix single-instance logic (#314)
Replaced the previous QSharedMemory-based single-instance logic with a clean QLocalServer approach. The old method left stale shared memory and socket files after crashes, causing false "already running" states and occasional segmentation faults.
1 parent 826e395 commit fa30d3c

File tree

1 file changed

+27
-25
lines changed

1 file changed

+27
-25
lines changed

linux/main.cpp

Lines changed: 27 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -987,30 +987,24 @@ private slots:
987987
int main(int argc, char *argv[]) {
988988
QApplication app(argc, argv);
989989

990-
QSharedMemory sharedMemory;
991-
sharedMemory.setKey("TcpServer-Key2");
990+
QLocalServer::removeServer("app_server");
992991

993-
// Check if app is already open
994-
if(sharedMemory.create(1) == false)
995-
{
996-
LOG_INFO("Another instance already running! Opening App Window Instead");
997-
QLocalSocket socket;
998-
// Connect to the original app, then trigger the reopen signal
999-
socket.connectToServer("app_server");
1000-
if (socket.waitForConnected(500)) {
1001-
socket.write("reopen");
1002-
socket.flush();
1003-
socket.waitForBytesWritten(500);
1004-
socket.disconnectFromServer();
1005-
app.exit(); // exit; process already running
1006-
return 0;
1007-
}
1008-
else
1009-
{
1010-
// Failed connection, log and open the app (assume it's not running)
1011-
LOG_ERROR("Failed to connect to the original app instance. Assuming it is not running.");
1012-
LOG_DEBUG("Socket error: " << socket.errorString());
1013-
}
992+
QFile stale("/tmp/app_server");
993+
if (stale.exists())
994+
stale.remove();
995+
996+
QLocalSocket socket_check;
997+
socket_check.connectToServer("app_server");
998+
999+
if (socket_check.waitForConnected(300)) {
1000+
LOG_INFO("Another instance already running! Reopening window...");
1001+
1002+
socket_check.write("reopen");
1003+
socket_check.flush();
1004+
socket_check.waitForBytesWritten(200);
1005+
socket_check.disconnectFromServer();
1006+
1007+
return 0;
10141008
}
10151009
app.setDesktopFileName("me.kavishdevar.librepods");
10161010
app.setQuitOnLastWindowClosed(false);
@@ -1092,8 +1086,16 @@ int main(int argc, char *argv[]) {
10921086
});
10931087

10941088
QObject::connect(&app, &QCoreApplication::aboutToQuit, [&]() {
1095-
LOG_DEBUG("Application is about to quit. Cleaning up...");
1096-
sharedMemory.detach();
1089+
LOG_DEBUG("Application quitting. Cleaning up local server...");
1090+
1091+
if (server.isListening()) {
1092+
server.close();
1093+
}
1094+
1095+
QLocalServer::removeServer("app_server");
1096+
QFile stale("/tmp/app_server");
1097+
if (stale.exists())
1098+
stale.remove();
10971099
});
10981100
return app.exec();
10991101
}

0 commit comments

Comments
 (0)