Skip to content

Instantly share code, notes, and snippets.

@siburu
Last active December 11, 2015 03:26
Show Gist options
  • Save siburu/77125e6307ea6a0b003a to your computer and use it in GitHub Desktop.
Save siburu/77125e6307ea6a0b003a to your computer and use it in GitHub Desktop.
Test code for investigating Golang's mmap behaviour
package main
import (
"fmt"
"syscall"
"unsafe"
)
type slice struct {
addr uintptr
len int
cap int
}
func check(b []byte) (uintptr, int, int) {
info := (*slice)(unsafe.Pointer(&b))
return info.addr, info.len, info.cap
}
func newSlice(addr uintptr, len int, cap int) []byte {
var b []byte
ps := (*slice)(unsafe.Pointer(&b))
ps.addr = addr
ps.len = len
ps.cap = cap
return b
}
func confirm(b []byte) {
for i := range b {
b[i] = byte(255)
}
}
func main() {
b, err := syscall.Mmap(0, 0, 4096,
syscall.PROT_READ|syscall.PROT_WRITE,
syscall.MAP_ANON|syscall.MAP_PRIVATE)
if err != nil {
panic("syscall.Mmap: " + err.Error())
}
confirm(b)
addr, length, capacity := check(b)
fmt.Printf("0x%016x %d %d\n", addr, length, capacity)
bb := append(b, byte(0))
confirm(bb)
addr, length, capacity = check(bb)
fmt.Printf("0x%016x %d %d\n", addr, length, capacity)
confirm(b)
addr, length, capacity = check(b)
fmt.Printf("0x%016x %d %d\n", addr, length, capacity)
newb := newSlice(addr, length, capacity)
err = syscall.Munmap(newb)
if err != nil {
panic("syscall.Munmap: " + err.Error())
}
println("Ok until now.")
// Panic
confirm(b)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment