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>
This commit is contained in:
Than McIntosh 2022-05-17 08:17:38 -04:00
parent db19b42ca8
commit cfd202c701

View file

@ -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 {