[Support] [Windows] Use RemoveFileOnSignal if unable to use the delete-on-close flag
authorMartin Storsjö <martin@martin.st>
Thu, 28 Oct 2021 07:57:27 +0000 (10:57 +0300)
committerMartin Storsjö <martin@martin.st>
Wed, 3 Nov 2021 19:29:37 +0000 (21:29 +0200)
This takes care of cleaning up the temp files on crashes. It doesn't
handle cleanup when explicitly killed though.

Differential Revision: https://reviews.llvm.org/D112710

llvm/lib/Support/Path.cpp

index a5045f6..536d114 100644 (file)
@@ -1212,9 +1212,7 @@ Error TempFile::discard() {
   std::error_code RemoveEC;
   if (Remove && !TmpName.empty()) {
     RemoveEC = fs::remove(TmpName);
-#ifndef _WIN32
     sys::DontRemoveFileOnSignal(TmpName);
-#endif
     if (!RemoveEC)
       TmpName = "";
   } else {
@@ -1260,8 +1258,8 @@ Error TempFile::keep(const Twine &Name) {
     if (RenameEC)
       remove(TmpName);
   }
-  sys::DontRemoveFileOnSignal(TmpName);
 #endif
+  sys::DontRemoveFileOnSignal(TmpName);
 
   if (!RenameEC)
     TmpName = "";
@@ -1283,9 +1281,8 @@ Error TempFile::keep() {
   auto H = reinterpret_cast<HANDLE>(_get_osfhandle(FD));
   if (std::error_code EC = setDeleteDisposition(H, false))
     return errorCodeToError(EC);
-#else
-  sys::DontRemoveFileOnSignal(TmpName);
 #endif
+  sys::DontRemoveFileOnSignal(TmpName);
 
   TmpName = "";
 
@@ -1309,17 +1306,20 @@ Expected<TempFile> TempFile::create(const Twine &Model, unsigned Mode,
   TempFile Ret(ResultPath, FD);
 #ifdef _WIN32
   auto H = reinterpret_cast<HANDLE>(_get_osfhandle(FD));
+  bool SetSignalHandler = false;
   if (std::error_code EC = setDeleteDisposition(H, true)) {
     Ret.RemoveOnClose = true;
+    SetSignalHandler = true;
   }
 #else
-  if (sys::RemoveFileOnSignal(ResultPath)) {
+  bool SetSignalHandler = true;
+#endif
+  if (SetSignalHandler && sys::RemoveFileOnSignal(ResultPath)) {
     // Make sure we delete the file when RemoveFileOnSignal fails.
     consumeError(Ret.discard());
     std::error_code EC(errc::operation_not_permitted);
     return errorCodeToError(EC);
   }
-#endif
   return std::move(Ret);
 }
 } // namespace fs