[llvm] 7e46f5d - [Support] Add mapped_file_region::sync(), equivalent to msync (#153632)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Aug 14 17:05:36 PDT 2025
Author: Steven Wu
Date: 2025-08-14T17:05:33-07:00
New Revision: 7e46f5db21d40dd386aced6586e5e1fa6892092f
URL: https://github.com/llvm/llvm-project/commit/7e46f5db21d40dd386aced6586e5e1fa6892092f
DIFF: https://github.com/llvm/llvm-project/commit/7e46f5db21d40dd386aced6586e5e1fa6892092f.diff
LOG: [Support] Add mapped_file_region::sync(), equivalent to msync (#153632)
Added:
Modified:
llvm/include/llvm/Support/FileSystem.h
llvm/lib/Support/Unix/Path.inc
llvm/lib/Support/Windows/Path.inc
llvm/unittests/Support/Path.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/Support/FileSystem.h b/llvm/include/llvm/Support/FileSystem.h
index 31fedc37bf776..ee7a77c578747 100644
--- a/llvm/include/llvm/Support/FileSystem.h
+++ b/llvm/include/llvm/Support/FileSystem.h
@@ -1342,6 +1342,11 @@ class mapped_file_region {
LLVM_ABI size_t size() const;
LLVM_ABI char *data() const;
+ /// Write changes to disk and synchronize. Equivalent to POSIX msync. This
+ /// will wait for flushing memory-mapped region back to disk and can be very
+ /// slow.
+ LLVM_ABI std::error_code sync() const;
+
/// Get a const view of the data. Modifying this memory has undefined
/// behavior.
LLVM_ABI const char *const_data() const;
diff --git a/llvm/lib/Support/Unix/Path.inc b/llvm/lib/Support/Unix/Path.inc
index cc02cae40ec76..31fb1e8fe9b75 100644
--- a/llvm/lib/Support/Unix/Path.inc
+++ b/llvm/lib/Support/Unix/Path.inc
@@ -876,6 +876,12 @@ void mapped_file_region::unmapImpl() {
::munmap(Mapping, Size);
}
+std::error_code mapped_file_region::sync() const {
+ if (int Res = ::msync(Mapping, Size, MS_SYNC))
+ return std::error_code(Res, std::generic_category());
+ return std::error_code();
+}
+
void mapped_file_region::dontNeedImpl() {
assert(Mode == mapped_file_region::readonly);
if (!Mapping)
diff --git a/llvm/lib/Support/Windows/Path.inc b/llvm/lib/Support/Windows/Path.inc
index fdf9d540a6488..9001c19c057cf 100644
--- a/llvm/lib/Support/Windows/Path.inc
+++ b/llvm/lib/Support/Windows/Path.inc
@@ -1006,6 +1006,14 @@ void mapped_file_region::unmapImpl() {
void mapped_file_region::dontNeedImpl() {}
+std::error_code mapped_file_region::sync() const {
+ if (!::FlushViewOfFile(Mapping, Size))
+ return mapWindowsError(GetLastError());
+ if (!::FlushFileBuffers(FileHandle))
+ return mapWindowsError(GetLastError());
+ return std::error_code();
+}
+
int mapped_file_region::alignment() {
SYSTEM_INFO SysInfo;
::GetSystemInfo(&SysInfo);
diff --git a/llvm/unittests/Support/Path.cpp b/llvm/unittests/Support/Path.cpp
index 355aa6b9ade06..888729b9dd249 100644
--- a/llvm/unittests/Support/Path.cpp
+++ b/llvm/unittests/Support/Path.cpp
@@ -1471,6 +1471,43 @@ TEST_F(FileSystemTest, FileMapping) {
ASSERT_NO_ERROR(fs::remove(TempPath));
}
+TEST_F(FileSystemTest, FileMappingSync) {
+ // Create a temp file.
+ SmallString<0> TempPath(TestDirectory);
+ sys::path::append(TempPath, "test-%%%%");
+ auto TempFileOrError = fs::TempFile::create(TempPath);
+ ASSERT_TRUE((bool)TempFileOrError);
+ fs::TempFile File = std::move(*TempFileOrError);
+ StringRef Content("hello there");
+ std::string FileName = File.TmpName;
+ ASSERT_NO_ERROR(
+ fs::resize_file_before_mapping_readwrite(File.FD, Content.size()));
+ {
+ // Map in the file and write some content.
+ std::error_code EC;
+ fs::mapped_file_region MFR(fs::convertFDToNativeFile(File.FD),
+ fs::mapped_file_region::readwrite,
+ Content.size(), 0, EC);
+
+ // Keep the file so it can be read.
+ ASSERT_FALSE((bool)File.keep());
+
+ // Write content through mapped memory.
+ ASSERT_NO_ERROR(EC);
+ std::copy(Content.begin(), Content.end(), MFR.data());
+
+ // Synchronize to file system.
+ ASSERT_FALSE((bool)MFR.sync());
+
+ // Check the file content using file IO APIs.
+ auto Buffer = MemoryBuffer::getFile(FileName);
+ ASSERT_TRUE((bool)Buffer);
+ ASSERT_EQ(Content, Buffer->get()->getBuffer());
+ }
+ // Manually remove the test file.
+ ASSERT_FALSE((bool)fs::remove(FileName));
+}
+
TEST(Support, NormalizePath) {
// Input, Expected Win, Expected Posix
using TestTuple = std::tuple<const char *, const char *, const char *>;
More information about the llvm-commits
mailing list