1// Copyright 2011 Evan Shaw. All rights reserved. 2// Use of this source code is governed by a BSD-style 3// license that can be found in the LICENSE file. 4 5// +build darwin dragonfly freebsd linux openbsd solaris netbsd 6 7package mmap 8 9import ( 10 "syscall" 11) 12 13func mmap(len int, inprot, inflags, fd uintptr, off int64) ([]byte, error) { 14 flags := syscall.MAP_SHARED 15 prot := syscall.PROT_READ 16 switch { 17 case inprot© != 0: 18 prot |= syscall.PROT_WRITE 19 flags = syscall.MAP_PRIVATE 20 case inprot&RDWR != 0: 21 prot |= syscall.PROT_WRITE 22 } 23 if inprot&EXEC != 0 { 24 prot |= syscall.PROT_EXEC 25 } 26 if inflags&ANON != 0 { 27 flags |= syscall.MAP_ANON 28 } 29 30 b, err := syscall.Mmap(int(fd), off, len, prot, flags) 31 if err != nil { 32 return nil, err 33 } 34 return b, nil 35} 36 37func flush(addr, len uintptr) error { 38 _, _, errno := syscall.Syscall(_SYS_MSYNC, addr, len, _MS_SYNC) 39 if errno != 0 { 40 return syscall.Errno(errno) 41 } 42 return nil 43} 44 45func lock(addr, len uintptr) error { 46 _, _, errno := syscall.Syscall(syscall.SYS_MLOCK, addr, len, 0) 47 if errno != 0 { 48 return syscall.Errno(errno) 49 } 50 return nil 51} 52 53func unlock(addr, len uintptr) error { 54 _, _, errno := syscall.Syscall(syscall.SYS_MUNLOCK, addr, len, 0) 55 if errno != 0 { 56 return syscall.Errno(errno) 57 } 58 return nil 59} 60 61func unmap(addr, len uintptr) error { 62 _, _, errno := syscall.Syscall(syscall.SYS_MUNMAP, addr, len, 0) 63 if errno != 0 { 64 return syscall.Errno(errno) 65 } 66 return nil 67} 68