bool QLockFilePrivate::isApparentlyStale() const { qint64 pid; QString hostname, appname; if (!getLockInfo(&pid, &hostname, &appname)) return false; if (hostname.isEmpty() || hostname == localHostName()) { if (::kill(pid, 0) == -1 && errno == ESRCH) return true; // PID doesn't exist anymore } const qint64 age = QFileInfo(fileName).lastModified().secsTo(QDateTime::currentDateTime()) * 1000; return staleLockTime > 0 && age > staleLockTime; }
bool QLockFilePrivate::isApparentlyStale() const { qint64 pid; QString hostname, appname; if (getLockInfo(&pid, &hostname, &appname)) { if (hostname.isEmpty() || hostname == QString::fromLocal8Bit(localHostName())) { if (::kill(pid, 0) == -1 && errno == ESRCH) return true; // PID doesn't exist anymore const QString processName = processNameByPid(pid); if (!processName.isEmpty()) { QFileInfo fi(appname); if (fi.isSymLink()) fi.setFile(fi.symLinkTarget()); if (processName != fi.fileName()) return true; // PID got reused by a different application. } } } const qint64 age = QFileInfo(fileName).lastModified().msecsTo(QDateTime::currentDateTime()); return staleLockTime > 0 && age > staleLockTime; }
bool QLockFilePrivate::isApparentlyStale() const { qint64 pid; QString hostname, appname; if (!getLockInfo(&pid, &hostname, &appname)) return false; // On WinRT there seems to be no way of obtaining information about other // processes due to sandboxing #ifndef Q_OS_WINRT HANDLE procHandle = ::OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid); if (!procHandle) return true; // We got a handle but check if process is still alive DWORD dwR = ::WaitForSingleObject(procHandle, 0); ::CloseHandle(procHandle); if (dwR == WAIT_TIMEOUT) return true; #endif // !Q_OS_WINRT const qint64 age = QFileInfo(fileName).lastModified().msecsTo(QDateTime::currentDateTime()); return staleLockTime > 0 && age > staleLockTime; }