[PATCH] D42925: Call FlushFileBuffers on readwrite file mappings.

Zachary Turner via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Feb 15 10:39:04 PST 2018


This revision was automatically updated to reflect the committed changes.
Closed by commit rL325274: Call FlushFileBuffers on output files. (authored by zturner, committed by ).

Changed prior to commit:
  https://reviews.llvm.org/D42925?vs=132872&id=134457#toc

Repository:
  rL LLVM

https://reviews.llvm.org/D42925

Files:
  llvm/trunk/include/llvm/Support/FileSystem.h
  llvm/trunk/lib/Support/Windows/Path.inc


Index: llvm/trunk/lib/Support/Windows/Path.inc
===================================================================
--- llvm/trunk/lib/Support/Windows/Path.inc
+++ llvm/trunk/lib/Support/Windows/Path.inc
@@ -822,6 +822,8 @@
 
 std::error_code mapped_file_region::init(int FD, uint64_t Offset,
                                          mapmode Mode) {
+  this->FD = FD;
+  this->Mode = Mode;
   HANDLE FileHandle = reinterpret_cast<HANDLE>(_get_osfhandle(FD));
   if (FileHandle == INVALID_HANDLE_VALUE)
     return make_error_code(errc::bad_file_descriptor);
@@ -887,8 +889,20 @@
 }
 
 mapped_file_region::~mapped_file_region() {
-  if (Mapping)
+  if (Mapping) {
     ::UnmapViewOfFile(Mapping);
+
+    if (Mode == mapmode::readwrite) {
+      // There is a Windows kernel bug, the exact trigger conditions of which
+      // are not well understood.  When triggered, dirty pages are not properly
+      // flushed and subsequent process's attempts to read a file can return
+      // invalid data.  Calling FlushFileBuffers on the write handle is
+      // sufficient to ensure that this bug is not triggered.
+      HANDLE FileHandle = reinterpret_cast<HANDLE>(_get_osfhandle(FD));
+      if (FileHandle != INVALID_HANDLE_VALUE)
+        ::FlushFileBuffers(FileHandle);
+    }
+  }
 }
 
 size_t mapped_file_region::size() const {
Index: llvm/trunk/include/llvm/Support/FileSystem.h
===================================================================
--- llvm/trunk/include/llvm/Support/FileSystem.h
+++ llvm/trunk/include/llvm/Support/FileSystem.h
@@ -819,6 +819,8 @@
   /// Platform-specific mapping state.
   size_t Size;
   void *Mapping;
+  int FD;
+  mapmode Mode;
 
   std::error_code init(int FD, uint64_t Offset, mapmode Mode);
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D42925.134457.patch
Type: text/x-patch
Size: 1740 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180215/2e731585/attachment.bin>


More information about the llvm-commits mailing list