From e3e177d40781fb68f1f9744817935c79d121b482 Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Tue, 11 Jun 2013 23:35:21 +0300 Subject: [PATCH] QtSingleApplication: Fix race If a starting instance locks the shared memory while another instance that is destructed tries to lock, when the destructed one tests for running peers, it doesn't detect the newly started instance, since its QtLocalPeer object is not initialized until after parsing the command-line arguments Change-Id: I05aeb771ba67390f554bff7a80c475b3e4d37984 Reviewed-by: Friedemann Kleint Reviewed-by: Daniel Teske --- src/app/main.cpp | 3 +-- .../qtsingleapplication/qtsingleapplication.cpp | 12 ++++-------- src/shared/qtsingleapplication/qtsingleapplication.h | 3 --- 3 files changed, 5 insertions(+), 13 deletions(-) diff --git a/src/app/main.cpp b/src/app/main.cpp index a5c9606c87b..3a24d1f6087 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -497,8 +497,7 @@ int main(int argc, char **argv) errorOverview.exec(); } - // Set up lock and remote arguments. - app.initialize(); + // Set up remote arguments. QObject::connect(&app, SIGNAL(messageReceived(QString,QObject*)), &pluginManager, SLOT(remoteArguments(QString,QObject*))); diff --git a/src/shared/qtsingleapplication/qtsingleapplication.cpp b/src/shared/qtsingleapplication/qtsingleapplication.cpp index 87ca1308599..692dd844412 100644 --- a/src/shared/qtsingleapplication/qtsingleapplication.cpp +++ b/src/shared/qtsingleapplication/qtsingleapplication.cpp @@ -93,6 +93,10 @@ QtSingleApplication::QtSingleApplication(const QString &appId, int &argc, char * // Add current pid to list and terminate it *pids++ = QCoreApplication::applicationPid(); *pids = 0; + pidPeer = new QtLocalPeer(this, appId + QLatin1Char('-') + + QString::number(QCoreApplication::applicationPid())); + connect(pidPeer, SIGNAL(messageReceived(QString,QObject*)), SIGNAL(messageReceived(QString,QObject*))); + pidPeer->isClient(); lockfile.unlock(); } @@ -137,14 +141,6 @@ bool QtSingleApplication::isRunning(qint64 pid) return peer.isClient(); } -void QtSingleApplication::initialize(bool) -{ - pidPeer = new QtLocalPeer(this, appId + QLatin1Char('-') + - QString::number(QCoreApplication::applicationPid())); - connect(pidPeer, SIGNAL(messageReceived(QString,QObject*)), SIGNAL(messageReceived(QString,QObject*))); - pidPeer->isClient(); -} - bool QtSingleApplication::sendMessage(const QString &message, int timeout, qint64 pid) { if (pid == -1) { diff --git a/src/shared/qtsingleapplication/qtsingleapplication.h b/src/shared/qtsingleapplication/qtsingleapplication.h index a54d0812917..7ba2f1ea340 100644 --- a/src/shared/qtsingleapplication/qtsingleapplication.h +++ b/src/shared/qtsingleapplication/qtsingleapplication.h @@ -56,9 +56,6 @@ public Q_SLOTS: bool sendMessage(const QString &message, int timeout = 5000, qint64 pid = -1); void activateWindow(); -public: - void initialize(bool = true); - Q_SIGNALS: void messageReceived(const QString &message, QObject *socket); void fileOpenRequest(const QString &file);