diff --git a/include/llvm/Support/FileSystem.h b/include/llvm/Support/FileSystem.h index 02db4596bf1..66bd18a6e3f 100644 --- a/include/llvm/Support/FileSystem.h +++ b/include/llvm/Support/FileSystem.h @@ -666,7 +666,15 @@ inline std::error_code file_size(const Twine &Path, uint64_t &Result) { /// @returns errc::success if the file times were successfully set, otherwise a /// platform-specific error_code or errc::function_not_supported on /// platforms where the functionality isn't available. -std::error_code setLastModificationAndAccessTime(int FD, TimePoint<> Time); +std::error_code setLastAccessAndModificationTime(int FD, TimePoint<> AccessTime, + TimePoint<> ModificationTime); + +/// Simpler version that sets both file modification and access time to the same +/// time. +inline std::error_code setLastAccessAndModificationTime(int FD, + TimePoint<> Time) { + return setLastAccessAndModificationTime(FD, Time, Time); +} /// Is status available? /// diff --git a/lib/Support/Unix/Path.inc b/lib/Support/Unix/Path.inc index 7ad57d892ff..3ca006a6daf 100644 --- a/lib/Support/Unix/Path.inc +++ b/lib/Support/Unix/Path.inc @@ -583,17 +583,22 @@ std::error_code setPermissions(const Twine &Path, perms Permissions) { return std::error_code(); } -std::error_code setLastModificationAndAccessTime(int FD, TimePoint<> Time) { +std::error_code setLastAccessAndModificationTime(int FD, TimePoint<> AccessTime, + TimePoint<> ModificationTime) { #if defined(HAVE_FUTIMENS) timespec Times[2]; - Times[0] = Times[1] = sys::toTimeSpec(Time); + Times[0] = sys::toTimeSpec(AccessTime); + Times[1] = sys::toTimeSpec(ModificationTime); if (::futimens(FD, Times)) return std::error_code(errno, std::generic_category()); return std::error_code(); #elif defined(HAVE_FUTIMES) timeval Times[2]; - Times[0] = Times[1] = sys::toTimeVal( - std::chrono::time_point_cast(Time)); + Times[0] = sys::toTimeVal( + std::chrono::time_point_cast(AccessTime)); + Times[1] = + sys::toTimeVal(std::chrono::time_point_cast( + ModificationTime)); if (::futimes(FD, Times)) return std::error_code(errno, std::generic_category()); return std::error_code(); diff --git a/lib/Support/Windows/Path.inc b/lib/Support/Windows/Path.inc index f425d607af4..57557dbc3da 100644 --- a/lib/Support/Windows/Path.inc +++ b/lib/Support/Windows/Path.inc @@ -766,10 +766,12 @@ std::error_code setPermissions(const Twine &Path, perms Permissions) { return std::error_code(); } -std::error_code setLastModificationAndAccessTime(int FD, TimePoint<> Time) { - FILETIME FT = toFILETIME(Time); +std::error_code setLastAccessAndModificationTime(int FD, TimePoint<> AccessTime, + TimePoint<> ModificationTime) { + FILETIME AccessFT = toFILETIME(AccessTime); + FILETIME ModifyFT = toFILETIME(ModificationTime); HANDLE FileHandle = reinterpret_cast(_get_osfhandle(FD)); - if (!SetFileTime(FileHandle, NULL, &FT, &FT)) + if (!SetFileTime(FileHandle, NULL, &AccessFT, &ModifyFT)) return mapWindowsError(::GetLastError()); return std::error_code(); } diff --git a/tools/llvm-ar/llvm-ar.cpp b/tools/llvm-ar/llvm-ar.cpp index 64be08ff946..16fee89d89d 100644 --- a/tools/llvm-ar/llvm-ar.cpp +++ b/tools/llvm-ar/llvm-ar.cpp @@ -410,7 +410,7 @@ static void doExtract(StringRef Name, const object::Archive::Child &C) { auto ModTimeOrErr = C.getLastModified(); failIfError(ModTimeOrErr.takeError()); failIfError( - sys::fs::setLastModificationAndAccessTime(FD, ModTimeOrErr.get())); + sys::fs::setLastAccessAndModificationTime(FD, ModTimeOrErr.get())); } if (close(FD)) diff --git a/unittests/Support/Path.cpp b/unittests/Support/Path.cpp index 158d6cfa3c3..02076726b15 100644 --- a/unittests/Support/Path.cpp +++ b/unittests/Support/Path.cpp @@ -1297,7 +1297,7 @@ TEST_F(FileSystemTest, OpenFileForRead) { ASSERT_NO_ERROR(sys::fs::openFileForWrite(Twine(TempPath), FileDescriptor, fs::CD_OpenExisting)); TimePoint<> Epoch(std::chrono::milliseconds(0)); - ASSERT_NO_ERROR(fs::setLastModificationAndAccessTime(FileDescriptor, Epoch)); + ASSERT_NO_ERROR(fs::setLastAccessAndModificationTime(FileDescriptor, Epoch)); ::close(FileDescriptor); // Open the file and ensure access time is updated, when forced.