1
0
Fork 0
forked from judah/xx
xx/mem/mem_unix.go

59 lines
1.1 KiB
Go

//go:build unix
package mem
import (
"syscall"
"unsafe"
)
const (
PERM_NONE = syscall.PROT_NONE
PERM_READ = syscall.PROT_READ
PERM_WRITE = syscall.PROT_WRITE
PERM_EXECUTE = syscall.PROT_EXEC
)
func Reserve(total_address_space uintptr) ([]byte, error) {
data, err := syscall.Mmap(-1, 0, int(total_address_space), syscall.PROT_NONE, syscall.MAP_PRIVATE|syscall.MAP_ANON)
if err != nil {
return nil, err
}
return data, nil
}
func Unreserve(reserved []byte) error {
return syscall.Munmap(reserved)
}
func Commit(reserved []byte, perms int) error {
return syscall.Mprotect(reserved, perms)
}
func Decommit(committed []byte) (err error) {
err = syscall.Mprotect(committed, syscall.PROT_NONE)
if err != nil {
return
}
return madvise(committed, syscall.MADV_DONTNEED)
}
var _zero uintptr
func madvise(b []byte, advice int) (err error) {
var _p0 unsafe.Pointer
if len(b) > 0 {
_p0 = unsafe.Pointer(&b[0])
} else {
_p0 = unsafe.Pointer(&_zero)
}
_, _, e := syscall.Syscall(syscall.SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice))
if e != 0 {
err = syscall.Errno(e)
}
return
}