aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorThan McIntosh <thanm@google.com>2022-05-17 08:17:38 -0400
committerThan McIntosh <thanm@google.com>2022-05-31 11:37:38 +0000
commitcfd202c701d3c1fda740a8c3c725fbb704054591 (patch)
tree4b41888da0c7b1f8791a36374edbfe78d56a3447 /src
parentdb19b42ca8771c25aa09e3747812f0229d44e75c (diff)
downloadgo-cfd202c701d3c1fda740a8c3c725fbb704054591.tar.xz
cmd/link: call syscall.FlushFileBuffers on outbuf Unmap
In the windows version of OutBuf.munmap, call syscall.FlushFileBuffers after the call to syscall.FlushViewOfFile, on the theory that this will help flush all associated meta-data for the file the linker is writing. Updates #44817. Change-Id: Ibff7d05008a91eeed7634d2760153851e15e1c18 Reviewed-on: https://go-review.googlesource.com/c/go/+/406814 Reviewed-by: Cherry Mui <cherryyz@google.com> Reviewed-by: Alex Brainman <alex.brainman@gmail.com>
Diffstat (limited to 'src')
-rw-r--r--src/cmd/link/internal/ld/outbuf_windows.go12
1 files changed, 12 insertions, 0 deletions
diff --git a/src/cmd/link/internal/ld/outbuf_windows.go b/src/cmd/link/internal/ld/outbuf_windows.go
index 915c72bef3..a568a17011 100644
--- a/src/cmd/link/internal/ld/outbuf_windows.go
+++ b/src/cmd/link/internal/ld/outbuf_windows.go
@@ -59,6 +59,18 @@ func (out *OutBuf) munmap() {
if err != nil {
Exitf("FlushViewOfFile failed: %v", err)
}
+ // Issue 44817: apparently the call below may be needed (according
+ // to the Windows docs) in addition to the FlushViewOfFile call
+ // above, " ... to flush all the dirty pages plus the metadata for
+ // the file and ensure that they are physically written to disk".
+ // Windows DOC links:
+ //
+ // https://docs.microsoft.com/en-us/windows/win32/api/memoryapi/nf-memoryapi-flushviewoffile
+ // https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-flushfilebuffers
+ err = syscall.FlushFileBuffers(syscall.Handle(out.f.Fd()))
+ if err != nil {
+ Exitf("FlushFileBuffers failed: %v", err)
+ }
err = syscall.UnmapViewOfFile(uintptr(unsafe.Pointer(&out.buf[0])))
out.buf = nil
if err != nil {