mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
[Support] Modify LockFileManager::waitForUnlock() to return info about how the lock was released.
llvm-svn: 205683
This commit is contained in:
parent
088dc80ca7
commit
239746d5db
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user