mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
[Windows FS] Allow moving files in TempFile::keep
In r338216 / D49860 TempFile::keep was extended to allow keeping across filesystems. The aim on Windows was to have this happen in rename_internal using the existing system API. However, to fix an issue and preserve the idea of "renaming" not being a move, put Windows keep-across-filesystem in TempFile::keep. Differential Revision: https://reviews.llvm.org/D50048 llvm-svn: 338841
This commit is contained in:
parent
222b9aadec
commit
17ff598941
@ -1159,8 +1159,16 @@ Error TempFile::keep(const Twine &Name) {
|
||||
// If we can't cancel the delete don't rename.
|
||||
auto H = reinterpret_cast<HANDLE>(_get_osfhandle(FD));
|
||||
std::error_code RenameEC = setDeleteDisposition(H, false);
|
||||
if (!RenameEC)
|
||||
if (!RenameEC) {
|
||||
RenameEC = rename_fd(FD, Name);
|
||||
// If rename failed because it's cross-device, copy instead
|
||||
if (RenameEC ==
|
||||
std::error_code(ERROR_NOT_SAME_DEVICE, std::system_category())) {
|
||||
RenameEC = copy_file(TmpName, Name);
|
||||
setDeleteDisposition(H, true);
|
||||
}
|
||||
}
|
||||
|
||||
// If we can't rename, discard the temporary file.
|
||||
if (RenameEC)
|
||||
setDeleteDisposition(H, true);
|
||||
|
@ -450,7 +450,7 @@ static std::error_code rename_handle(HANDLE FromHandle, const Twine &To) {
|
||||
if (std::error_code EC2 = realPathFromHandle(FromHandle, WideFrom))
|
||||
return EC2;
|
||||
if (::MoveFileExW(WideFrom.begin(), WideTo.begin(),
|
||||
MOVEFILE_REPLACE_EXISTING | MOVEFILE_COPY_ALLOWED))
|
||||
MOVEFILE_REPLACE_EXISTING))
|
||||
return std::error_code();
|
||||
return mapWindowsError(GetLastError());
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user