From 1e550b518fd49f954b6c422174f4a1a50f5268dc Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Tue, 28 Apr 2015 09:47:28 +0200 Subject: Listener: Use a lockfile to enforce that only a single instance is running. I tried using flock on a socket, but without success. --- synchronizer/listener.cpp | 9 +++++++++ synchronizer/listener.h | 3 +++ 2 files changed, 12 insertions(+) (limited to 'synchronizer') 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 @@ #include #include +#include Listener::Listener(const QByteArray &resourceName, QObject *parent) : QObject(parent), @@ -48,6 +49,14 @@ Listener::Listener(const QByteArray &resourceName, QObject *parent) connect(m_server, &QLocalServer::newConnection, this, &Listener::acceptConnection); Trace() << "Trying to open " << m_resourceName; + + m_lockfile = new QLockFile(resourceName + ".lock"); + m_lockfile->setStaleLockTime(0); + if (!m_lockfile->tryLock(0)) { + Warning() << "Failed to acquire exclusive lock on socket."; + exit(-1); + } + if (!m_server->listen(QString::fromLatin1(resourceName))) { // FIXME: multiple starts need to be handled here 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: QByteArray commandBuffer; }; +class QLockFile; + class Listener : public QObject { Q_OBJECT @@ -93,4 +95,5 @@ private: QTimer *m_clientBufferProcessesTimer; QTimer *m_checkConnectionsTimer; int m_messageId; + QLockFile *m_lockfile; }; -- cgit v1.2.3