diff options
author | Christian Mollekopf <chrigi_1@fastmail.fm> | 2015-04-28 09:47:28 +0200 |
---|---|---|
committer | Christian Mollekopf <chrigi_1@fastmail.fm> | 2015-04-28 09:47:28 +0200 |
commit | 1e550b518fd49f954b6c422174f4a1a50f5268dc (patch) | |
tree | 2bf1825a3c29dcfd107b180a941285e1df212fa6 | |
parent | de00fa24da6f5af70a8a8f95ab6d4f996ffeb6bb (diff) | |
download | sink-1e550b518fd49f954b6c422174f4a1a50f5268dc.tar.gz sink-1e550b518fd49f954b6c422174f4a1a50f5268dc.zip |
Listener: Use a lockfile to enforce that only a single instance is running.
I tried using flock on a socket, but without success.
-rw-r--r-- | synchronizer/listener.cpp | 9 | ||||
-rw-r--r-- | synchronizer/listener.h | 3 |
2 files changed, 12 insertions, 0 deletions
diff --git a/synchronizer/listener.cpp b/synchronizer/listener.cpp index e930a02..e9e6188 100644 --- a/synchronizer/listener.cpp +++ b/synchronizer/listener.cpp | |||
@@ -33,6 +33,7 @@ | |||
33 | 33 | ||
34 | #include <QLocalSocket> | 34 | #include <QLocalSocket> |
35 | #include <QTimer> | 35 | #include <QTimer> |
36 | #include <QLockFile> | ||
36 | 37 | ||
37 | Listener::Listener(const QByteArray &resourceName, QObject *parent) | 38 | Listener::Listener(const QByteArray &resourceName, QObject *parent) |
38 | : QObject(parent), | 39 | : QObject(parent), |
@@ -48,6 +49,14 @@ Listener::Listener(const QByteArray &resourceName, QObject *parent) | |||
48 | connect(m_server, &QLocalServer::newConnection, | 49 | connect(m_server, &QLocalServer::newConnection, |
49 | this, &Listener::acceptConnection); | 50 | this, &Listener::acceptConnection); |
50 | Trace() << "Trying to open " << m_resourceName; | 51 | Trace() << "Trying to open " << m_resourceName; |
52 | |||
53 | m_lockfile = new QLockFile(resourceName + ".lock"); | ||
54 | m_lockfile->setStaleLockTime(0); | ||
55 | if (!m_lockfile->tryLock(0)) { | ||
56 | Warning() << "Failed to acquire exclusive lock on socket."; | ||
57 | exit(-1); | ||
58 | } | ||
59 | |||
51 | if (!m_server->listen(QString::fromLatin1(resourceName))) { | 60 | if (!m_server->listen(QString::fromLatin1(resourceName))) { |
52 | // FIXME: multiple starts need to be handled here | 61 | // FIXME: multiple starts need to be handled here |
53 | m_server->removeServer(resourceName); | 62 | m_server->removeServer(resourceName); |
diff --git a/synchronizer/listener.h b/synchronizer/listener.h index d2ef0fc..b3929e7 100644 --- a/synchronizer/listener.h +++ b/synchronizer/listener.h | |||
@@ -53,6 +53,8 @@ public: | |||
53 | QByteArray commandBuffer; | 53 | QByteArray commandBuffer; |
54 | }; | 54 | }; |
55 | 55 | ||
56 | class QLockFile; | ||
57 | |||
56 | class Listener : public QObject | 58 | class Listener : public QObject |
57 | { | 59 | { |
58 | Q_OBJECT | 60 | Q_OBJECT |
@@ -93,4 +95,5 @@ private: | |||
93 | QTimer *m_clientBufferProcessesTimer; | 95 | QTimer *m_clientBufferProcessesTimer; |
94 | QTimer *m_checkConnectionsTimer; | 96 | QTimer *m_checkConnectionsTimer; |
95 | int m_messageId; | 97 | int m_messageId; |
98 | QLockFile *m_lockfile; | ||
96 | }; | 99 | }; |