forked from OSchip/llvm-project
[Support] [Windows] Use RemoveFileOnSignal if unable to use the delete-on-close flag
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
This commit is contained in:
parent
7ff943a9ed
commit
a39eba7207
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue