Revert create_symbolic_link and both depending changes
authorReid Kleckner <reid@kleckner.net>
Thu, 6 Mar 2014 19:07:35 +0000 (19:07 +0000)
committerReid Kleckner <reid@kleckner.net>
Thu, 6 Mar 2014 19:07:35 +0000 (19:07 +0000)
This reverts commits r203136, r203137, and r203138.

This code doesn't build on Windows.  Even on Vista+, Windows requires
elevated privileges to create a symlink.  Therefore we can't use
symlinks in the compiler.  We'll have to find another approach.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@203143 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Support/FileSystem.h
lib/Support/LockFileManager.cpp
lib/Support/Unix/Path.inc
lib/Support/Windows/Path.inc

index c1314a2a23f528f9602b5a94db9809709c52885c..1812d24ead723f24de733c66a46287816bd3de18 100644 (file)
@@ -293,14 +293,6 @@ error_code create_directory(const Twine &path, bool IgnoreExisting = true);
 ///          , otherwise a platform specific error_code.
 error_code create_hard_link(const Twine &to, const Twine &from);
 
 ///          , otherwise a platform specific error_code.
 error_code create_hard_link(const Twine &to, const Twine &from);
 
-/// @brief Create a symbolic link from \a from to \a to.
-///
-/// @param to The path to link to.
-/// @param from The path to link from. This is created.
-/// @returns errc::success if successful
-///          , otherwise a platform specific error_code.
-error_code create_symbolic_link(const Twine &to, const Twine &from);
-
 /// @brief Get the current path.
 ///
 /// @param result Holds the current path on return.
 /// @brief Get the current path.
 ///
 /// @param result Holds the current path on return.
index 957f2fdd7a525d57aaf404e2f5f8ca06b03f35db..61afb79fb2278377793b0f3e42919cacb84f76f1 100644 (file)
@@ -115,42 +115,34 @@ LockFileManager::LockFileManager(StringRef FileName)
     }
   }
 
     }
   }
 
-  while (1) {
-    // 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_symbolic_link(UniqueLockFileName.str(),
-                                        LockFileName.str());
-    if (EC == errc::success)
-      return;
+  // Create a hard link from the lock file name. If this succeeds, we're done.
+  error_code EC
+    = sys::fs::create_hard_link(UniqueLockFileName.str(),
+                                      LockFileName.str());
+  if (EC == errc::success)
+    return;
 
 
-    if (EC != errc::file_exists) {
-      Error = EC;
-      return;
-    }
+  // Creating the hard link failed.
 
 
-    // Someone else managed to create the lock file first. Read the process ID
-    // from the lock file.
-    if ((Owner = readLockFile(LockFileName))) {
-      // Wipe out our unique lock file (it's useless now)
-      sys::fs::remove(UniqueLockFileName.str());
-      return;
-    }
+#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
 
 
-    if (!sys::fs::exists(LockFileName.str())) {
-      // The previous owner released the lock file before we could read it.
-      // Try to get ownership again.
-      continue;
-    }
+  // 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());
+  if ((Owner = readLockFile(LockFileName)))
+    return;
 
 
-    // There is a lock file that nobody owns; try to clean it up and get
-    // ownership.
-    if ((EC = sys::fs::remove(LockFileName.str()))) {
-      Error = EC;
-      return;
-    }
-  }
+  // There is a lock file that nobody owns; try to clean it up and report
+  // an error.
+  sys::fs::remove(LockFileName.str());
+  Error = EC;
 }
 
 LockFileManager::LockFileState LockFileManager::getState() const {
 }
 
 LockFileManager::LockFileState LockFileManager::getState() const {
index fe3f43a6fd80d247330a4d3e976b4d14f8245f09..caa30c7533a27717e07c522eae3c3585e1319a50 100644 (file)
@@ -285,19 +285,6 @@ error_code create_hard_link(const Twine &to, const Twine &from) {
   return error_code::success();
 }
 
   return error_code::success();
 }
 
-error_code create_symbolic_link(const Twine &to, const Twine &from) {
-  // Get arguments.
-  SmallString<128> from_storage;
-  SmallString<128> to_storage;
-  StringRef f = from.toNullTerminatedStringRef(from_storage);
-  StringRef t = to.toNullTerminatedStringRef(to_storage);
-
-  if (::symlink(t.begin(), f.begin()) == -1)
-    return error_code(errno, system_category());
-
-  return error_code::success();
-}
-
 error_code remove(const Twine &path, bool IgnoreNonExisting) {
   SmallString<128> path_storage;
   StringRef p = path.toNullTerminatedStringRef(path_storage);
 error_code remove(const Twine &path, bool IgnoreNonExisting) {
   SmallString<128> path_storage;
   StringRef p = path.toNullTerminatedStringRef(path_storage);
index bb68a3eff57520428378255881ec1f485548c8bd..c39600357be3a7a898016a68024462d7db331af4 100644 (file)
@@ -177,25 +177,6 @@ error_code create_hard_link(const Twine &to, const Twine &from) {
   return error_code::success();
 }
 
   return error_code::success();
 }
 
-error_code create_symbolic_link(const Twine &to, const Twine &from) {
-  // Get arguments.
-  SmallString<128> from_storage;
-  SmallString<128> to_storage;
-  StringRef f = from.toStringRef(from_storage);
-  StringRef t = to.toStringRef(to_storage);
-
-  // Convert to utf-16.
-  SmallVector<wchar_t, 128> wide_from;
-  SmallVector<wchar_t, 128> wide_to;
-  if (error_code ec = UTF8ToUTF16(f, wide_from)) return ec;
-  if (error_code ec = UTF8ToUTF16(t, wide_to)) return ec;
-
-  if (!::CreateSymbolicLinkW(wide_from.begin(), wide_to.begin(), NULL))
-    return windows_error(::GetLastError());
-
-  return error_code::success();
-}
-
 error_code remove(const Twine &path, bool IgnoreNonExisting) {
   SmallString<128> path_storage;
   SmallVector<wchar_t, 128> path_utf16;
 error_code remove(const Twine &path, bool IgnoreNonExisting) {
   SmallString<128> path_storage;
   SmallVector<wchar_t, 128> path_utf16;