[Support/LockFileManager] Use symbolic link for the lock file.
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Thu, 6 Mar 2014 17:37:04 +0000 (17:37 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Thu, 6 Mar 2014 17:37:04 +0000 (17:37 +0000)
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

lib/Support/LockFileManager.cpp

index 61afb79fb2278377793b0f3e42919cacb84f76f1..acb310efeec1ca43a59c5e0b2de7f5586bdcfa04 100644 (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());