[Support/LockFileManager] Use symbolic link for the lock file.

Hard links do not work on SMB network directories, and it causes us to fail
to build clang module files if the module cache is in such a directory.
rdar://15944959

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@203137 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Argyrios Kyrtzidis 2014-03-06 17:37:04 +00:00
parent bd3f9c0b6b
commit 7b95c0d529

View File

@ -115,24 +115,15 @@ LockFileManager::LockFileManager(StringRef FileName)
}
}
// Create a hard link from the lock file name. If this succeeds, we're done.
// Create a symbolic link from the lock file name. If this succeeds, we're done.
// Note that we are using symbolic link because hard links are not supported
// by all filesystems.
error_code EC
= sys::fs::create_hard_link(UniqueLockFileName.str(),
= sys::fs::create_symbolic_link(UniqueLockFileName.str(),
LockFileName.str());
if (EC == errc::success)
return;
// Creating the hard link failed.
#ifdef LLVM_ON_UNIX
// The creation of the hard link may appear to fail, but if stat'ing the
// unique file returns a link count of 2, then we can still declare success.
struct stat StatBuf;
if (stat(UniqueLockFileName.c_str(), &StatBuf) == 0 &&
StatBuf.st_nlink == 2)
return;
#endif
// Someone else managed to create the lock file first. Wipe out our unique
// lock file (it's useless now) and read the process ID from the lock file.
sys::fs::remove(UniqueLockFileName.str());