Windows/PathV2.inc: Retry rename() for (maximum) 2 seconds.
authorNAKAMURA Takumi <geek4civic@gmail.com>
Tue, 8 May 2012 14:31:46 +0000 (14:31 +0000)
committerNAKAMURA Takumi <geek4civic@gmail.com>
Tue, 8 May 2012 14:31:46 +0000 (14:31 +0000)
Files might be opend by system scanners (eg. file indexer, virus scanner, &c).

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

lib/Support/Windows/PathV2.inc

index e9ce5d9097a32e40af144729be329f198ae818e7..66b8d84f852e7f9dec9d8440175ba49d0f7bfbf3 100644 (file)
@@ -301,11 +301,21 @@ error_code rename(const Twine &from, const Twine &to) {
   if (error_code ec = UTF8ToUTF16(f, wide_from)) return ec;
   if (error_code ec = UTF8ToUTF16(t, wide_to)) return ec;
 
-  if (!::MoveFileExW(wide_from.begin(), wide_to.begin(),
-                     MOVEFILE_COPY_ALLOWED | MOVEFILE_REPLACE_EXISTING))
-    return windows_error(::GetLastError());
+  error_code ec = error_code::success();
+  for (int i = 0; i < 2000; i++) {
+    if (::MoveFileExW(wide_from.begin(), wide_to.begin(),
+                      MOVEFILE_COPY_ALLOWED | MOVEFILE_REPLACE_EXISTING))
+      return error_code::success();
+    ec = windows_error(::GetLastError());
+    if (ec != windows_error::access_denied)
+      break;
+    // Retry MoveFile() at ACCESS_DENIED.
+    // System scanners (eg. indexer) might open the source file when
+    // It is written and closed.
+    ::Sleep(1);
+  }
 
-  return error_code::success();
+  return ec;
 }
 
 error_code resize_file(const Twine &path, uint64_t size) {