// Copyright 2011 Evan Shaw. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build darwin dragonfly freebsd linux openbsd solaris package mmap import ( "syscall" ) func mmap(len int, inprot, inflags, fd uintptr, off int64) ([]byte, error) { flags := syscall.MAP_SHARED prot := syscall.PROT_READ switch { case inprot© != 0: prot |= syscall.PROT_WRITE flags = syscall.MAP_PRIVATE case inprot&RDWR != 0: prot |= syscall.PROT_WRITE } if inprot&EXEC != 0 { prot |= syscall.PROT_EXEC } if inflags&ANON != 0 { flags |= syscall.MAP_ANON } b, err := syscall.Mmap(int(fd), off, len, prot, flags) if err != nil { return nil, err } return b, nil } func flush(addr, len uintptr) error { _, _, errno := syscall.Syscall(syscall.SYS_MSYNC, addr, len, syscall.MS_SYNC) if errno != 0 { return syscall.Errno(errno) } return nil } func lock(addr, len uintptr) error { _, _, errno := syscall.Syscall(syscall.SYS_MLOCK, addr, len, 0) if errno != 0 { return syscall.Errno(errno) } return nil } func unlock(addr, len uintptr) error { _, _, errno := syscall.Syscall(syscall.SYS_MUNLOCK, addr, len, 0) if errno != 0 { return syscall.Errno(errno) } return nil } func unmap(addr, len uintptr) error { _, _, errno := syscall.Syscall(syscall.SYS_MUNMAP, addr, len, 0) if errno != 0 { return syscall.Errno(errno) } return nil }