diff options
Diffstat (limited to 'src/cmd/link/internal/ld/outbuf_mmap.go')
-rw-r--r-- | src/cmd/link/internal/ld/outbuf_mmap.go | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/src/cmd/link/internal/ld/outbuf_mmap.go b/src/cmd/link/internal/ld/outbuf_mmap.go index 4075141171..c064e9686a 100644 --- a/src/cmd/link/internal/ld/outbuf_mmap.go +++ b/src/cmd/link/internal/ld/outbuf_mmap.go @@ -16,11 +16,15 @@ func (out *OutBuf) Mmap(filesize uint64) error { if err != nil { Exitf("resize output file failed: %v", err) } + out.length = filesize out.buf, err = syscall.Mmap(int(out.f.Fd()), 0, int(filesize), syscall.PROT_READ|syscall.PROT_WRITE, syscall.MAP_SHARED|syscall.MAP_FILE) return err } func (out *OutBuf) Munmap() { + if out.buf == nil { + return + } err := out.Msync() if err != nil { Exitf("msync output file failed: %v", err) @@ -34,9 +38,12 @@ func (out *OutBuf) Munmap() { } func (out *OutBuf) Msync() error { + if out.buf == nil || out.length <= 0 { + return nil + } // TODO: netbsd supports mmap and msync, but the syscall package doesn't define MSYNC. // It is excluded from the build tag for now. - _, _, errno := syscall.Syscall(syscall.SYS_MSYNC, uintptr(unsafe.Pointer(&out.buf[0])), uintptr(len(out.buf)), syscall.MS_SYNC) + _, _, errno := syscall.Syscall(syscall.SYS_MSYNC, uintptr(unsafe.Pointer(&out.buf[0])), uintptr(out.length), syscall.MS_SYNC) if errno != 0 { return errno } |