diff options
-rw-r--r-- | src/app/app.qbs | 18 | ||||
-rw-r--r-- | src/shared/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/shared/qtlockedfile/CMakeLists.txt | 17 | ||||
-rw-r--r-- | src/shared/qtlockedfile/README.txt | 10 | ||||
-rw-r--r-- | src/shared/qtlockedfile/namespace.patch | 70 | ||||
-rw-r--r-- | src/shared/qtlockedfile/qtlockedfile.cpp | 132 | ||||
-rw-r--r-- | src/shared/qtlockedfile/qtlockedfile.h | 48 | ||||
-rw-r--r-- | src/shared/qtlockedfile/qtlockedfile_unix.cpp | 82 | ||||
-rw-r--r-- | src/shared/qtlockedfile/qtlockedfile_win.cpp | 170 | ||||
-rw-r--r-- | src/shared/qtsingleapplication/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/shared/qtsingleapplication/qtlocalpeer.cpp | 7 | ||||
-rw-r--r-- | src/shared/qtsingleapplication/qtlocalpeer.h | 9 | ||||
-rw-r--r-- | src/shared/qtsingleapplication/qtsingleapplication.cpp | 15 |
13 files changed, 15 insertions, 566 deletions
diff --git a/src/app/app.qbs b/src/app/app.qbs index a0b30ae2ae..f684909bec 100644 --- a/src/app/app.qbs +++ b/src/app/app.qbs @@ -40,7 +40,6 @@ QtcProduct { : ["$ORIGIN/../" + qtc.libDirName + "/qtcreator"] cpp.includePaths: [ project.sharedSourcesDir + "/qtsingleapplication", - project.sharedSourcesDir + "/qtlockedfile", ] cpp.frameworks: base.concat(qbs.targetOS.contains("macos") ? ["Foundation"] : []) @@ -58,7 +57,6 @@ QtcProduct { "../shared/qtsingleapplication/qtsingleapplication.cpp", "../shared/qtsingleapplication/qtlocalpeer.h", "../shared/qtsingleapplication/qtlocalpeer.cpp", - "../shared/qtlockedfile/qtlockedfile.cpp", "../tools/qtcreatorcrashhandler/crashhandlersetup.cpp", "../tools/qtcreatorcrashhandler/crashhandlersetup.h" ] @@ -85,22 +83,6 @@ QtcProduct { } Group { - name: "QtLockedFile_unix" - condition: qbs.targetOS.contains("unix") - files: [ - "../shared/qtlockedfile/qtlockedfile_unix.cpp" - ] - } - - Group { - name: "QtLockedFile_win" - condition: qbs.targetOS.contains("windows") - files: [ - "../shared/qtlockedfile/qtlockedfile_win.cpp" - ] - } - - Group { name: "main_macos" condition: qbs.targetOS.contains("macos") files: [ diff --git a/src/shared/CMakeLists.txt b/src/shared/CMakeLists.txt index 93409b0bf4..e6210760d2 100644 --- a/src/shared/CMakeLists.txt +++ b/src/shared/CMakeLists.txt @@ -1,7 +1,6 @@ add_subdirectory(designerintegrationv2) add_subdirectory(proparser) add_subdirectory(qtsingleapplication) -add_subdirectory(qtlockedfile) add_subdirectory(help) add_subdirectory(registryaccess) diff --git a/src/shared/qtlockedfile/CMakeLists.txt b/src/shared/qtlockedfile/CMakeLists.txt deleted file mode 100644 index f7f8a1c666..0000000000 --- a/src/shared/qtlockedfile/CMakeLists.txt +++ /dev/null @@ -1,17 +0,0 @@ -if (WIN32) - set(OS_SOURCES qtlockedfile_win.cpp) -else() - set(OS_SOURCES qtlockedfile_unix.cpp) -endif() - -add_library(shared_qtlockedfile STATIC ${OS_SOURCES} qtlockedfile.cpp qtlockedfile.h) -target_link_libraries(shared_qtlockedfile Qt::Core) -target_include_directories(shared_qtlockedfile PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}") -if (WIN32) - target_compile_definitions(shared_qtlockedfile PRIVATE - "QT_QTLOCKEDFILE_EXPORT=__declspec(dllexport)" _UNICODE UNICODE) -endif() - -if (WITH_SANITIZE) - qtc_enable_sanitize(shared_qtlockedfile ${SANITIZE_FLAGS}) -endif() diff --git a/src/shared/qtlockedfile/README.txt b/src/shared/qtlockedfile/README.txt deleted file mode 100644 index 6fcf2fd295..0000000000 --- a/src/shared/qtlockedfile/README.txt +++ /dev/null @@ -1,10 +0,0 @@ -This is the src directory of the QtLockedFile -solution integrated over from addons/main/utils/qtlockedfile/src . - -namespace.patch was applied to introduce the SharedTools namespace. - -It is required by the QtSingleApplication solution. - -History: - -16.05.2008 Integrated diff --git a/src/shared/qtlockedfile/namespace.patch b/src/shared/qtlockedfile/namespace.patch deleted file mode 100644 index 301cae8cff..0000000000 --- a/src/shared/qtlockedfile/namespace.patch +++ /dev/null @@ -1,70 +0,0 @@ - ---- qtlockedfile.cpp 1970-01-01 01:00:00.000000000 -+++ qtlockedfile.cpp 2008/05/16 10:51:19.000000000 -@@ -1,5 +1,7 @@ - #include "qtlockedfile.h" - -+namespace SharedTools { -+ - /*! - \class QtLockedFile - -@@ -123,3 +125,5 @@ - - Destroys the \e QtLockedFile object. If any locks were held, they are released. - */ -+ -+} - ---- qtlockedfile.h 1970-01-01 01:00:00.000000000 -+++ qtlockedfile.h 2008/05/16 10:51:19.000000000 -@@ -19,6 +19,8 @@ - # define QT_QTLOCKEDFILE_EXPORT - #endif - -+namespace SharedTools { -+ - class QT_QTLOCKEDFILE_EXPORT QtLockedFile : public QFile - { - public: -@@ -41,4 +43,6 @@ - LockMode m_lock_mode; - }; - -+} -+ - #endif - ---- qtlockedfile_unix.cpp 1970-01-01 01:00:00.000000000 -+++ qtlockedfile_unix.cpp 2008/05/16 10:51:19.000000000 -@@ -5,6 +5,8 @@ - - #include "qtlockedfile.h" - -+namespace SharedTools { -+ - bool QtLockedFile::lock(LockMode mode, bool block) - { - if (!isOpen()) { -@@ -73,3 +75,4 @@ - unlock(); - } - -+} - ---- qtlockedfile_win.cpp 1970-01-01 01:00:00.000000000 -+++ qtlockedfile_win.cpp 2008/05/16 10:51:19.000000000 -@@ -2,6 +2,8 @@ - #include <qt_windows.h> - #include <QtCore/QFileInfo> - -+namespace SharedTools { -+ - #define SEMAPHORE_PREFIX "QtLockedFile semaphore " - #define MUTEX_PREFIX "QtLockedFile mutex " - #define SEMAPHORE_MAX 100 -@@ -168,3 +170,4 @@ - } - } - -+} diff --git a/src/shared/qtlockedfile/qtlockedfile.cpp b/src/shared/qtlockedfile/qtlockedfile.cpp deleted file mode 100644 index a14c7e14b0..0000000000 --- a/src/shared/qtlockedfile/qtlockedfile.cpp +++ /dev/null @@ -1,132 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 - -#include "qtlockedfile.h" - -namespace SharedTools { - -/*! - \class QtLockedFile - - \brief The QtLockedFile class extends QFile with advisory locking functions. - - A file may be locked in read or write mode. Multiple instances of - \e QtLockedFile, created in multiple processes running on the same - machine, may have a file locked in read mode. Exactly one instance - may have it locked in write mode. A read and a write lock cannot - exist simultaneously on the same file. - - The file locks are advisory. This means that nothing prevents - another process from manipulating a locked file using QFile or - file system functions offered by the OS. Serialization is only - guaranteed if all processes that access the file use - QtLockedFile. Also, while holding a lock on a file, a process - must not open the same file again (through any API), or locks - can be unexpectedly lost. - - The lock provided by an instance of \e QtLockedFile is released - whenever the program terminates. This is true even when the - program crashes and no destructors are called. -*/ - -/*! \enum QtLockedFile::LockMode - - This enum describes the available lock modes. - - \value ReadLock A read lock. - \value WriteLock A write lock. - \value NoLock Neither a read lock nor a write lock. -*/ - -/*! - Constructs an unlocked \e QtLockedFile object. This constructor behaves in the same way - as \e QFile::QFile(). - - \sa QFile::QFile() -*/ -QtLockedFile::QtLockedFile() - : QFile() -{ -#ifdef Q_OS_WIN - m_semaphore_hnd = 0; - m_mutex_hnd = 0; -#endif - m_lock_mode = NoLock; -} - -/*! - Constructs an unlocked QtLockedFile object with file \a name. This constructor behaves in - the same way as \e QFile::QFile(const QString&). - - \sa QFile::QFile() -*/ -QtLockedFile::QtLockedFile(const QString &name) - : QFile(name) -{ -#ifdef Q_OS_WIN - m_semaphore_hnd = 0; - m_mutex_hnd = 0; -#endif - m_lock_mode = NoLock; -} - -/*! - Returns \e true if this object has a in read or write lock; - otherwise returns \e false. - - \sa lockMode() -*/ -bool QtLockedFile::isLocked() const -{ - return m_lock_mode != NoLock; -} - -/*! - Returns the type of lock currently held by this object, or \e QtLockedFile::NoLock. - - \sa isLocked() -*/ -QtLockedFile::LockMode QtLockedFile::lockMode() const -{ - return m_lock_mode; -} - -/*! - \fn bool QtLockedFile::lock(LockMode mode, bool block = true) - - Obtains a lock of type \a mode. - - If \a block is true, this - function will block until the lock is acquired. If \a block is - false, this function returns \e false immediately if the lock cannot - be acquired. - - If this object already has a lock of type \a mode, this function returns \e true immediately. If this object has a lock of a different type than \a mode, the lock - is first released and then a new lock is obtained. - - This function returns \e true if, after it executes, the file is locked by this object, - and \e false otherwise. - - \sa unlock(), isLocked(), lockMode() -*/ - -/*! - \fn bool QtLockedFile::unlock() - - Releases a lock. - - If the object has no lock, this function returns immediately. - - This function returns \e true if, after it executes, the file is not locked by - this object, and \e false otherwise. - - \sa lock(), isLocked(), lockMode() -*/ - -/*! - \fn QtLockedFile::~QtLockedFile() - - Destroys the \e QtLockedFile object. If any locks were held, they are released. -*/ - -} // namespace SharedTools diff --git a/src/shared/qtlockedfile/qtlockedfile.h b/src/shared/qtlockedfile/qtlockedfile.h deleted file mode 100644 index d4aa9a59c0..0000000000 --- a/src/shared/qtlockedfile/qtlockedfile.h +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 - -#pragma once - -#include <QFile> - -#if defined(Q_OS_WIN) -# if !defined(QT_QTLOCKEDFILE_EXPORT) && !defined(QT_QTLOCKEDFILE_IMPORT) -# define QT_QTLOCKEDFILE_EXPORT -# elif defined(QT_QTLOCKEDFILE_IMPORT) -# if defined(QT_QTLOCKEDFILE_EXPORT) -# undef QT_QTLOCKEDFILE_EXPORT -# endif -# define QT_QTLOCKEDFILE_EXPORT __declspec(dllimport) -# elif defined(QT_QTLOCKEDFILE_EXPORT) -# undef QT_QTLOCKEDFILE_EXPORT -# define QT_QTLOCKEDFILE_EXPORT __declspec(dllexport) -# endif -#else -# define QT_QTLOCKEDFILE_EXPORT -#endif - -namespace SharedTools { - -class QT_QTLOCKEDFILE_EXPORT QtLockedFile : public QFile -{ -public: - enum LockMode { NoLock = 0, ReadLock, WriteLock }; - - QtLockedFile(); - QtLockedFile(const QString &name); - ~QtLockedFile(); - - bool lock(LockMode mode, bool block = true); - bool unlock(); - bool isLocked() const; - LockMode lockMode() const; - -private: -#ifdef Q_OS_WIN - Qt::HANDLE m_semaphore_hnd; - Qt::HANDLE m_mutex_hnd; -#endif - LockMode m_lock_mode; -}; - -} // namespace SharedTools diff --git a/src/shared/qtlockedfile/qtlockedfile_unix.cpp b/src/shared/qtlockedfile/qtlockedfile_unix.cpp deleted file mode 100644 index e189f31472..0000000000 --- a/src/shared/qtlockedfile/qtlockedfile_unix.cpp +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 - -#include "qtlockedfile.h" - -#include <string.h> -#include <errno.h> -#include <unistd.h> -#include <fcntl.h> - -namespace SharedTools { - -bool QtLockedFile::lock(LockMode mode, bool block) -{ - if (!isOpen()) { - qWarning("QtLockedFile::lock(): file is not opened"); - return false; - } - - if (mode == NoLock) - return unlock(); - - if (mode == m_lock_mode) - return true; - - if (m_lock_mode != NoLock) - unlock(); - - struct flock fl; - fl.l_whence = SEEK_SET; - fl.l_start = 0; - fl.l_len = 0; - fl.l_type = (mode == ReadLock) ? F_RDLCK : F_WRLCK; - int cmd = block ? F_SETLKW : F_SETLK; - int ret = fcntl(handle(), cmd, &fl); - - if (ret == -1) { - if (errno != EINTR && errno != EAGAIN) - qWarning("QtLockedFile::lock(): fcntl: %s", strerror(errno)); - return false; - } - - - m_lock_mode = mode; - return true; -} - - -bool QtLockedFile::unlock() -{ - if (!isOpen()) { - qWarning("QtLockedFile::unlock(): file is not opened"); - return false; - } - - if (!isLocked()) - return true; - - struct flock fl; - fl.l_whence = SEEK_SET; - fl.l_start = 0; - fl.l_len = 0; - fl.l_type = F_UNLCK; - int ret = fcntl(handle(), F_SETLKW, &fl); - - if (ret == -1) { - qWarning("QtLockedFile::lock(): fcntl: %s", strerror(errno)); - return false; - } - - m_lock_mode = NoLock; - remove(); - return true; -} - -QtLockedFile::~QtLockedFile() -{ - if (isOpen()) - unlock(); -} - -} // namespace SharedTools diff --git a/src/shared/qtlockedfile/qtlockedfile_win.cpp b/src/shared/qtlockedfile/qtlockedfile_win.cpp deleted file mode 100644 index 2f35635b55..0000000000 --- a/src/shared/qtlockedfile/qtlockedfile_win.cpp +++ /dev/null @@ -1,170 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 - -#include "qtlockedfile.h" - -#include <qt_windows.h> -#include <QFileInfo> - -namespace SharedTools { - -#define SEMAPHORE_PREFIX "QtLockedFile semaphore " -#define MUTEX_PREFIX "QtLockedFile mutex " -#define SEMAPHORE_MAX 100 - -static QString errorCodeToString(DWORD errorCode) -{ - QString result; - char *data = 0; - FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, - 0, errorCode, 0, - (char*)&data, 0, 0); - result = QString::fromLocal8Bit(data); - if (data != 0) - LocalFree(data); - - if (result.endsWith(QLatin1Char('\n'))) - result.truncate(result.length() - 1); - - return result; -} - -bool QtLockedFile::lock(LockMode mode, bool block) -{ - if (!isOpen()) { - qWarning("QtLockedFile::lock(): file is not opened"); - return false; - } - - if (mode == m_lock_mode) - return true; - - if (m_lock_mode != 0) - unlock(); - - if (m_semaphore_hnd == 0) { - QFileInfo fi(*this); - QString sem_name = QString::fromLatin1(SEMAPHORE_PREFIX) - + fi.absoluteFilePath().toLower(); - - m_semaphore_hnd = CreateSemaphoreW(0, SEMAPHORE_MAX, SEMAPHORE_MAX, - (TCHAR*)sem_name.utf16()); - - if (m_semaphore_hnd == 0) { - qWarning("QtLockedFile::lock(): CreateSemaphore: %s", - errorCodeToString(GetLastError()).toLatin1().constData()); - return false; - } - } - - bool gotMutex = false; - int decrement; - if (mode == ReadLock) { - decrement = 1; - } else { - decrement = SEMAPHORE_MAX; - if (m_mutex_hnd == 0) { - QFileInfo fi(*this); - QString mut_name = QString::fromLatin1(MUTEX_PREFIX) - + fi.absoluteFilePath().toLower(); - - m_mutex_hnd = CreateMutexW(NULL, FALSE, (TCHAR*)mut_name.utf16()); - - if (m_mutex_hnd == 0) { - qWarning("QtLockedFile::lock(): CreateMutex: %s", - errorCodeToString(GetLastError()).toLatin1().constData()); - return false; - } - } - DWORD res = WaitForSingleObject(m_mutex_hnd, block ? INFINITE : 0); - if (res == WAIT_TIMEOUT) - return false; - if (res == WAIT_FAILED) { - qWarning("QtLockedFile::lock(): WaitForSingleObject (mutex): %s", - errorCodeToString(GetLastError()).toLatin1().constData()); - return false; - } - gotMutex = true; - } - - for (int i = 0; i < decrement; ++i) { - DWORD res = WaitForSingleObject(m_semaphore_hnd, block ? INFINITE : 0); - if (res == WAIT_TIMEOUT) { - if (i) { - // A failed nonblocking rw locking. Undo changes to semaphore. - if (ReleaseSemaphore(m_semaphore_hnd, i, NULL) == 0) { - qWarning("QtLockedFile::unlock(): ReleaseSemaphore: %s", - errorCodeToString(GetLastError()).toLatin1().constData()); - // Fall through - } - } - if (gotMutex) - ReleaseMutex(m_mutex_hnd); - return false; - } - if (res != WAIT_OBJECT_0) { - if (gotMutex) - ReleaseMutex(m_mutex_hnd); - qWarning("QtLockedFile::lock(): WaitForSingleObject (semaphore): %s", - errorCodeToString(GetLastError()).toLatin1().constData()); - return false; - } - } - - m_lock_mode = mode; - if (gotMutex) - ReleaseMutex(m_mutex_hnd); - return true; -} - -bool QtLockedFile::unlock() -{ - if (!isOpen()) { - qWarning("QtLockedFile::unlock(): file is not opened"); - return false; - } - - if (!isLocked()) - return true; - - int increment; - if (m_lock_mode == ReadLock) - increment = 1; - else - increment = SEMAPHORE_MAX; - - DWORD ret = ReleaseSemaphore(m_semaphore_hnd, increment, 0); - if (ret == 0) { - qWarning("QtLockedFile::unlock(): ReleaseSemaphore: %s", - errorCodeToString(GetLastError()).toLatin1().constData()); - return false; - } - - m_lock_mode = QtLockedFile::NoLock; - remove(); - return true; -} - -QtLockedFile::~QtLockedFile() -{ - if (isOpen()) - unlock(); - if (m_mutex_hnd != 0) { - DWORD ret = CloseHandle(m_mutex_hnd); - if (ret == 0) { - qWarning("QtLockedFile::~QtLockedFile(): CloseHandle (mutex): %s", - errorCodeToString(GetLastError()).toLatin1().constData()); - } - m_mutex_hnd = 0; - } - if (m_semaphore_hnd != 0) { - DWORD ret = CloseHandle(m_semaphore_hnd); - if (ret == 0) { - qWarning("QtLockedFile::~QtLockedFile(): CloseHandle (semaphore): %s", - errorCodeToString(GetLastError()).toLatin1().constData()); - } - m_semaphore_hnd = 0; - } -} - -} // namespace SharedTools diff --git a/src/shared/qtsingleapplication/CMakeLists.txt b/src/shared/qtsingleapplication/CMakeLists.txt index fae6a08545..5b8e9c0271 100644 --- a/src/shared/qtsingleapplication/CMakeLists.txt +++ b/src/shared/qtsingleapplication/CMakeLists.txt @@ -2,7 +2,7 @@ add_library(shared_qtsingleapplication STATIC qtsingleapplication.cpp qtsingleapplication.h qtlocalpeer.cpp qtlocalpeer.h ) -target_link_libraries(shared_qtsingleapplication shared_qtlockedfile Qt::Core Qt::Network Qt::Widgets) +target_link_libraries(shared_qtsingleapplication Qt::Core Qt::Network Qt::Widgets) target_include_directories(shared_qtsingleapplication PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}") if (WIN32) target_compile_definitions(shared_qtsingleapplication PRIVATE "QT_QTSINGLEAPPLICATION_EXPORT=__declspec(dllexport)") diff --git a/src/shared/qtsingleapplication/qtlocalpeer.cpp b/src/shared/qtsingleapplication/qtlocalpeer.cpp index af72ece772..47dd3805ba 100644 --- a/src/shared/qtsingleapplication/qtlocalpeer.cpp +++ b/src/shared/qtsingleapplication/qtlocalpeer.cpp @@ -59,16 +59,15 @@ QtLocalPeer::QtLocalPeer(QObject *parent, const QString &appId) QString lockName = QDir(QDir::tempPath()).absolutePath() + QLatin1Char('/') + socketName + QLatin1String("-lockfile"); - lockFile.setFileName(lockName); - lockFile.open(QIODevice::ReadWrite); + lockFile.reset(new QLockFile(lockName)); } bool QtLocalPeer::isClient() { - if (lockFile.isLocked()) + if (lockFile->isLocked()) return false; - if (!lockFile.lock(QtLockedFile::WriteLock, false)) + if (!lockFile->tryLock()) return true; if (!QLocalServer::removeServer(socketName)) diff --git a/src/shared/qtsingleapplication/qtlocalpeer.h b/src/shared/qtsingleapplication/qtlocalpeer.h index 67a0d42e2c..27578a7aca 100644 --- a/src/shared/qtsingleapplication/qtlocalpeer.h +++ b/src/shared/qtsingleapplication/qtlocalpeer.h @@ -3,11 +3,12 @@ #pragma once -#include <qtlockedfile.h> +#include <QDir> #include <QLocalServer> #include <QLocalSocket> -#include <QDir> +#include <QLockFile> +#include <QScopedPointer> namespace SharedTools { @@ -31,8 +32,8 @@ protected: QString id; QString socketName; - QLocalServer* server; - QtLockedFile lockFile; + QLocalServer* server{nullptr}; + QScopedPointer<QLockFile> lockFile; }; } // namespace SharedTools diff --git a/src/shared/qtsingleapplication/qtsingleapplication.cpp b/src/shared/qtsingleapplication/qtsingleapplication.cpp index 0f8fa8b6d1..b791d1875f 100644 --- a/src/shared/qtsingleapplication/qtsingleapplication.cpp +++ b/src/shared/qtsingleapplication/qtsingleapplication.cpp @@ -4,10 +4,9 @@ #include "qtsingleapplication.h" #include "qtlocalpeer.h" -#include <qtlockedfile.h> - #include <QDir> #include <QFileOpenEvent> +#include <QLockFile> #include <QSharedMemory> #include <QWidget> @@ -50,11 +49,10 @@ QtSingleApplication::QtSingleApplication(const QString &appId, int &argc, char * } } - // QtLockedFile is used to workaround QTBUG-10364 - QtLockedFile lockfile(instancesLockFilename(appSessionId)); + // QLockFile is used to workaround QTBUG-10364 + QLockFile lockfile(instancesLockFilename(appSessionId)); - lockfile.open(QtLockedFile::ReadWrite); - lockfile.lock(QtLockedFile::WriteLock); + lockfile.lock(); qint64 *pids = static_cast<qint64 *>(instances->data()); if (!created) { // Find the first instance that it still running @@ -79,9 +77,8 @@ QtSingleApplication::~QtSingleApplication() if (!instances) return; const qint64 appPid = QCoreApplication::applicationPid(); - QtLockedFile lockfile(instancesLockFilename(QtLocalPeer::appSessionId(appId))); - lockfile.open(QtLockedFile::ReadWrite); - lockfile.lock(QtLockedFile::WriteLock); + QLockFile lockfile(instancesLockFilename(QtLocalPeer::appSessionId(appId))); + lockfile.lock(); // Rewrite array, removing current pid and previously crashed ones qint64 *pids = static_cast<qint64 *>(instances->data()); qint64 *newpids = pids; |