SVN commit 929151 by shaforo: I forgot to commit my patch to trunk. CCMAIL:faure@kde.org thanks for noticing this. M +2 -1 klockfile.h M +42 -44 klockfile_unix.cpp --- trunk/KDE/kdelibs/kdecore/io/klockfile.h #929150:929151 @@ -78,7 +78,8 @@ /** * Automatically remove a lock when a lock is detected that is stale - * for more than staleTime() seconds. + * for more than staleTime() seconds, or if the process that created it + * is not running anymore. */ ForceFlag = 2 }; --- trunk/KDE/kdelibs/kdecore/io/klockfile_unix.cpp #929150:929151 @@ -275,54 +275,13 @@ break; } } - else // KLockFile::Fail + else // KLockFile::Fail -- there is already such a file present (e.g. left by a crashed app) { if (!d->staleTimer.isNull() && d->statBuf != st_buf) d->staleTimer = QTime(); - if (!d->staleTimer.isNull()) + if (d->staleTimer.isNull()) { - bool isStale = false; - if ((d->pid > 0) && !d->hostname.isEmpty()) - { - // Check if hostname is us - char hostname[256]; - hostname[0] = 0; - gethostname(hostname, 255); - hostname[255] = 0; - - if (d->hostname == QLatin1String(hostname)) - { - // Check if pid still exists - int res = ::kill(d->pid, 0); - if ((res == -1) && (errno == ESRCH)) - isStale = true; - } - } - if (d->staleTimer.elapsed() > (d->staleTime*1000)) - isStale = true; - - if (isStale) - { - if ((options & ForceFlag) == 0) - return KLockFile::LockStale; - - result = deleteStaleLock(d->file, d->statBuf, d->linkCountSupport, d->componentData); - - if (result == KLockFile::LockOK) - { - // Lock deletion successful - d->staleTimer = QTime(); - continue; // Now try to get the new lock - } - else if (result != KLockFile::LockFail) - { - return result; - } - } - } - else - { memcpy(&(d->statBuf), &st_buf, sizeof(KDE_struct_stat)); d->staleTimer.start(); @@ -342,9 +301,48 @@ d->hostname = ts.readLine(); } } + + bool isStale = false; + if ((d->pid > 0) && !d->hostname.isEmpty()) + { + // Check if hostname is us + char hostname[256]; + hostname[0] = 0; + gethostname(hostname, 255); + hostname[255] = 0; + + if (d->hostname == QLatin1String(hostname)) + { + // Check if pid still exists + int res = ::kill(d->pid, 0); + if ((res == -1) && (errno == ESRCH)) + isStale = true; + } + } + if (d->staleTimer.elapsed() > (d->staleTime*1000)) + isStale = true; + + if (isStale) + { + if ((options & ForceFlag) == 0) + return KLockFile::LockStale; + + result = deleteStaleLock(d->file, d->statBuf, d->linkCountSupport, d->componentData); + + if (result == KLockFile::LockOK) + { + // Lock deletion successful + d->staleTimer = QTime(); + continue; // Now try to get the new lock + } + else if (result != KLockFile::LockFail) + { + return result; + } + } } - if ((options & NoBlockFlag) != 0) + if (options & NoBlockFlag) break; struct timeval tv;