virtual_netbsd.odin 729 B

12345678910111213141516171819202122232425
  1. package mem_virtual
  2. import "core:sys/posix"
  3. _reserve :: proc "contextless" (size: uint) -> (data: []byte, err: Allocator_Error) {
  4. PROT_MPROTECT :: proc "contextless" (flags: posix.Prot_Flags) -> posix.Prot_Flags {
  5. return transmute(posix.Prot_Flags)(transmute(i32)flags << 3)
  6. }
  7. result := posix.mmap(nil, size, PROT_MPROTECT({.READ, .WRITE, .EXEC}), {.ANONYMOUS, .PRIVATE})
  8. if result == posix.MAP_FAILED {
  9. assert_contextless(posix.errno() == .ENOMEM)
  10. return nil, .Out_Of_Memory
  11. }
  12. return ([^]byte)(uintptr(result))[:size], nil
  13. }
  14. _decommit :: proc "contextless" (data: rawptr, size: uint) {
  15. MADV_FREE :: 6
  16. posix.mprotect(data, size, {})
  17. posix.posix_madvise(data, size, transmute(posix.MAdvice)i32(MADV_FREE))
  18. }