1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-23 11:13:28 +01:00

Move code. NFC.

This moves the TempFile implementation so that it can use system
specific code.

llvm-svn: 319134
This commit is contained in:
Rafael Espindola 2017-11-28 01:34:20 +00:00
parent 280d46dc97
commit f048c6c451

View File

@ -762,89 +762,6 @@ std::error_code createUniqueFile(const Twine &Model,
return createUniqueEntity(Model, Dummy, ResultPath, false, 0, FS_Name);
}
TempFile::TempFile(StringRef Name, int FD) : TmpName(Name), FD(FD) {}
TempFile::TempFile(TempFile &&Other) { *this = std::move(Other); }
TempFile &TempFile::operator=(TempFile &&Other) {
TmpName = std::move(Other.TmpName);
FD = Other.FD;
Other.Done = true;
return *this;
}
TempFile::~TempFile() { assert(Done); }
Error TempFile::discard() {
Done = true;
// Always try to close and remove.
std::error_code RemoveEC;
if (!TmpName.empty()) {
RemoveEC = fs::remove(TmpName);
sys::DontRemoveFileOnSignal(TmpName);
}
if (!RemoveEC)
TmpName = "";
if (FD != -1 && close(FD) == -1) {
std::error_code EC = std::error_code(errno, std::generic_category());
return errorCodeToError(EC);
}
FD = -1;
return errorCodeToError(RemoveEC);
}
Error TempFile::keep(const Twine &Name) {
assert(!Done);
Done = true;
// Always try to close and rename.
std::error_code RenameEC = fs::rename(TmpName, Name);
sys::DontRemoveFileOnSignal(TmpName);
if (!RenameEC)
TmpName = "";
if (close(FD) == -1) {
std::error_code EC(errno, std::generic_category());
return errorCodeToError(EC);
}
FD = -1;
return errorCodeToError(RenameEC);
}
Error TempFile::keep() {
assert(!Done);
Done = true;
sys::DontRemoveFileOnSignal(TmpName);
TmpName = "";
if (close(FD) == -1) {
std::error_code EC(errno, std::generic_category());
return errorCodeToError(EC);
}
FD = -1;
return Error::success();
}
Expected<TempFile> TempFile::create(const Twine &Model, unsigned Mode) {
int FD;
SmallString<128> ResultPath;
if (std::error_code EC = createUniqueFile(Model, FD, ResultPath, Mode))
return errorCodeToError(EC);
// Make sure we delete the file when RemoveFileOnSignal fails.
TempFile Ret(ResultPath, FD);
if (sys::RemoveFileOnSignal(ResultPath)) {
consumeError(Ret.discard());
std::error_code EC(errc::operation_not_permitted);
return errorCodeToError(EC);
}
return std::move(Ret);
}
static std::error_code
createTemporaryFile(const Twine &Model, int &ResultFD,
llvm::SmallVectorImpl<char> &ResultPath, FSEntity Type,
@ -1137,6 +1054,91 @@ ErrorOr<perms> getPermissions(const Twine &Path) {
namespace llvm {
namespace sys {
namespace fs {
TempFile::TempFile(StringRef Name, int FD) : TmpName(Name), FD(FD) {}
TempFile::TempFile(TempFile &&Other) { *this = std::move(Other); }
TempFile &TempFile::operator=(TempFile &&Other) {
TmpName = std::move(Other.TmpName);
FD = Other.FD;
Other.Done = true;
return *this;
}
TempFile::~TempFile() { assert(Done); }
Error TempFile::discard() {
Done = true;
// Always try to close and remove.
std::error_code RemoveEC;
if (!TmpName.empty()) {
RemoveEC = fs::remove(TmpName);
sys::DontRemoveFileOnSignal(TmpName);
}
if (!RemoveEC)
TmpName = "";
if (FD != -1 && close(FD) == -1) {
std::error_code EC = std::error_code(errno, std::generic_category());
return errorCodeToError(EC);
}
FD = -1;
return errorCodeToError(RemoveEC);
}
Error TempFile::keep(const Twine &Name) {
assert(!Done);
Done = true;
// Always try to close and rename.
std::error_code RenameEC = fs::rename(TmpName, Name);
sys::DontRemoveFileOnSignal(TmpName);
if (!RenameEC)
TmpName = "";
if (close(FD) == -1) {
std::error_code EC(errno, std::generic_category());
return errorCodeToError(EC);
}
FD = -1;
return errorCodeToError(RenameEC);
}
Error TempFile::keep() {
assert(!Done);
Done = true;
sys::DontRemoveFileOnSignal(TmpName);
TmpName = "";
if (close(FD) == -1) {
std::error_code EC(errno, std::generic_category());
return errorCodeToError(EC);
}
FD = -1;
return Error::success();
}
Expected<TempFile> TempFile::create(const Twine &Model, unsigned Mode) {
int FD;
SmallString<128> ResultPath;
if (std::error_code EC = createUniqueFile(Model, FD, ResultPath, Mode))
return errorCodeToError(EC);
// Make sure we delete the file when RemoveFileOnSignal fails.
TempFile Ret(ResultPath, FD);
if (sys::RemoveFileOnSignal(ResultPath)) {
consumeError(Ret.discard());
std::error_code EC(errc::operation_not_permitted);
return errorCodeToError(EC);
}
return std::move(Ret);
}
}
namespace path {
bool user_cache_directory(SmallVectorImpl<char> &Result, const Twine &Path1,