summaryrefslogtreecommitdiffstats
path: root/src/corelib
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib')
-rw-r--r--src/corelib/io/qlockfile_unix.cpp5
-rw-r--r--src/corelib/io/qlockfile_win.cpp12
2 files changed, 15 insertions, 2 deletions
diff --git a/src/corelib/io/qlockfile_unix.cpp b/src/corelib/io/qlockfile_unix.cpp
index d1ef9c1770..cd4cf3a50d 100644
--- a/src/corelib/io/qlockfile_unix.cpp
+++ b/src/corelib/io/qlockfile_unix.cpp
@@ -206,7 +206,10 @@ void QLockFile::unlock()
return;
close(d->fileHandle);
d->fileHandle = -1;
- QFile::remove(d->fileName);
+ if (!QFile::remove(d->fileName)) {
+ qWarning() << "Could not remove our own lock file" << d->fileName << "maybe permissions changed meanwhile?";
+ // This is bad because other users of this lock file will now have to wait for the stale-lock-timeout...
+ }
d->lockError = QLockFile::NoError;
d->isLocked = false;
}
diff --git a/src/corelib/io/qlockfile_win.cpp b/src/corelib/io/qlockfile_win.cpp
index 00c8a85bcc..5f82270706 100644
--- a/src/corelib/io/qlockfile_win.cpp
+++ b/src/corelib/io/qlockfile_win.cpp
@@ -47,6 +47,7 @@
#include "QtCore/qfileinfo.h"
#include "QtCore/qdatetime.h"
#include "QtCore/qdebug.h"
+#include "QtCore/qthread.h"
QT_BEGIN_NAMESPACE
@@ -149,7 +150,16 @@ void QLockFile::unlock()
if (!d->isLocked)
return;
CloseHandle(d->fileHandle);
- QFile::remove(d->fileName);
+ int attempts = 0;
+ static const int maxAttempts = 500; // 500ms
+ while (!QFile::remove(d->fileName) && ++attempts < maxAttempts) {
+ // Someone is reading the lock file right now (on Windows this prevents deleting it).
+ QThread::msleep(1);
+ }
+ if (attempts == maxAttempts) {
+ qWarning() << "Could not remove our own lock file" << d->fileName << ". Either other users of the lock file are reading it constantly for 500 ms, or we (no longer) have permissions to delete the file";
+ // This is bad because other users of this lock file will now have to wait for the stale-lock-timeout...
+ }
d->lockError = QLockFile::NoError;
d->isLocked = false;
}