[Support] Modify LockFileManager::waitForUnlock() to return info about how the lock was released.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@205683 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Argyrios Kyrtzidis 2014-04-06 03:19:31 +00:00
parent ec37734d3c
commit 20384a5583
2 changed files with 21 additions and 7 deletions

View File

@ -40,6 +40,16 @@ public:
LFS_Error
};
/// \brief Describes the result of waiting for the owner to release the lock.
enum WaitForUnlockResult {
/// \brief The lock was released successfully.
Res_Success,
/// \brief Owner died while holding the lock.
Res_OwnerDied,
/// \brief Reached timeout while waiting for the owner to release the lock.
Res_Timeout
};
private:
SmallString<128> FileName;
SmallString<128> LockFileName;
@ -67,7 +77,7 @@ public:
operator LockFileState() const { return getState(); }
/// \brief For a shared lock, wait until the owner releases the lock.
void waitForUnlock();
WaitForUnlockResult waitForUnlock();
};
} // end namespace llvm

View File

@ -43,8 +43,11 @@ LockFileManager::readLockFile(StringRef LockFileName) {
std::tie(Hostname, PIDStr) = getToken(MB->getBuffer(), " ");
PIDStr = PIDStr.substr(PIDStr.find_first_not_of(" "));
int PID;
if (!PIDStr.getAsInteger(10, PID))
return std::make_pair(std::string(Hostname), PID);
if (!PIDStr.getAsInteger(10, PID)) {
auto Owner = std::make_pair(std::string(Hostname), PID);
if (processStillExecuting(Owner.first, Owner.second))
return Owner;
}
// Delete the lock file. It's invalid anyway.
sys::fs::remove(LockFileName);
@ -171,9 +174,9 @@ LockFileManager::~LockFileManager() {
sys::fs::remove(UniqueLockFileName.str());
}
void LockFileManager::waitForUnlock() {
LockFileManager::WaitForUnlockResult LockFileManager::waitForUnlock() {
if (getState() != LFS_Shared)
return;
return Res_Success;
#if LLVM_ON_WIN32
unsigned long Interval = 1;
@ -211,7 +214,7 @@ void LockFileManager::waitForUnlock() {
// available now.
if (LockFileGone) {
if (sys::fs::exists(FileName.str())) {
return;
return Res_Success;
}
// The lock file is gone, so now we're waiting for the original file to
@ -234,7 +237,7 @@ void LockFileManager::waitForUnlock() {
// owning the lock died without cleaning up, just bail out.
if (!LockFileGone &&
!processStillExecuting((*Owner).first, (*Owner).second)) {
return;
return Res_OwnerDied;
}
// Exponentially increase the time we wait for the lock to be removed.
@ -257,4 +260,5 @@ void LockFileManager::waitForUnlock() {
);
// Give up.
return Res_Timeout;
}