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&COPY != 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