QLockFile: Use a more robust stale file detection

When a process that locked a lockfile crashes on Windows, sometimes
a new instance of the process fails to lock.

Unfortunately, I can't find a way to reproduce the problem consistently,
but it happens from time to time with Qt Creator and Qbs.

There are several ways to detect a dead process on Windows. Some of
them can be found in stackoverflow[1].

The current implementation of stale lock detection is based on the
second answer (using WaitForSingleObject), but apparently it doesn't
work in 100% of the cases.

The most voted answer[2] (using GetProcessExitCode) proves to work also
on this case.

[1] http://stackoverflow.com/q/1591342/764870
[2] http://stackoverflow.com/a/1591379/764870

Task-number: QTBUG-53392
Change-Id: Ied7bf00985d0f12e833b887a0143f7bdeee3e772
Reviewed-by: Kai Koehne <kai.koehne@qt.io>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
Orgad Shaneh 2016-05-15 14:53:38 +03:00 committed by Orgad Shaneh
parent 0f559a2d99
commit 261f9101dd

View File

@ -137,9 +137,11 @@ bool QLockFilePrivate::isApparentlyStale() const
if (!procHandle)
return true;
// We got a handle but check if process is still alive
DWORD dwR = ::WaitForSingleObject(procHandle, 0);
DWORD exitCode = 0;
if (!::GetExitCodeProcess(procHandle, &exitCode))
exitCode = 0;
::CloseHandle(procHandle);
if (dwR == WAIT_TIMEOUT)
if (exitCode != STILL_ACTIVE)
return true;
const QString processName = processNameByPid(pid);
if (!processName.isEmpty() && processName != appname)