Skip to content

Commit

Permalink
cmd/link: call syscall.FlushFileBuffers on outbuf Unmap
Browse files Browse the repository at this point in the history
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 golang#44817.

Change-Id: Ibff7d05008a91eeed7634d2760153851e15e1c18
Reviewed-on: https://go-review.googlesource.com/c/go/+/406814
Reviewed-by: Cherry Mui <[email protected]>
Reviewed-by: Alex Brainman <[email protected]>
  • Loading branch information
thanm committed May 31, 2022
1 parent db19b42 commit cfd202c
Showing 1 changed file with 12 additions and 0 deletions.
12 changes: 12 additions & 0 deletions src/cmd/link/internal/ld/outbuf_windows.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down

0 comments on commit cfd202c

Please sign in to comment.