From 7c9ca60ff03680921466aea20ef77de86802ea93 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Thu, 1 Aug 2024 22:17:10 +0200 Subject: [PATCH] mem/virtual: support the BSDs --- core/mem/virtual/virtual_other.odin | 3 +++ .../{virtual_darwin.odin => virtual_posix.odin} | 17 +++++++++++------ 2 files changed, 14 insertions(+), 6 deletions(-) rename core/mem/virtual/{virtual_darwin.odin => virtual_posix.odin} (82%) diff --git a/core/mem/virtual/virtual_other.odin b/core/mem/virtual/virtual_other.odin index 96d9683c4..4fcb61b04 100644 --- a/core/mem/virtual/virtual_other.odin +++ b/core/mem/virtual/virtual_other.odin @@ -1,5 +1,8 @@ //+private //+build !darwin +//+build !freebsd +//+build !openbsd +//+build !netbsd //+build !linux //+build !windows package mem_virtual diff --git a/core/mem/virtual/virtual_darwin.odin b/core/mem/virtual/virtual_posix.odin similarity index 82% rename from core/mem/virtual/virtual_darwin.odin rename to core/mem/virtual/virtual_posix.odin index 9098866d0..fbe89abfa 100644 --- a/core/mem/virtual/virtual_darwin.odin +++ b/core/mem/virtual/virtual_posix.odin @@ -1,12 +1,19 @@ -//+build darwin +//+build darwin, netbsd, freebsd, openbsd //+private package mem_virtual import "core:sys/posix" -MAP_ANONYMOUS :: 0x1000 /* allocated from memory, swap space */ +// Define non-posix needed flags: +when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD { + MAP_ANONYMOUS :: 0x1000 /* allocated from memory, swap space */ -MADV_FREE :: 5 /* pages unneeded, discard contents */ + MADV_FREE :: 5 /* pages unneeded, discard contents */ +} else when ODIN_OS == .OpenBSD || ODIN_OS == .NetBSD { + MAP_ANONYMOUS :: 0x1000 + + MADV_FREE :: 6 +} _reserve :: proc "contextless" (size: uint) -> (data: []byte, err: Allocator_Error) { flags := posix.Map_Flags{ .PRIVATE } + transmute(posix.Map_Flags)i32(MAP_ANONYMOUS) @@ -43,15 +50,13 @@ _protect :: proc "contextless" (data: rawptr, size: uint, flags: Protect_Flags) return posix.mprotect(data, size, transmute(posix.Prot_Flags)flags) == .OK } - _platform_memory_init :: proc() { - DEFAULT_PAGE_SIZE = 4096 + DEFAULT_PAGE_SIZE = posix.PAGE_SIZE // is power of two assert(DEFAULT_PAGE_SIZE != 0 && (DEFAULT_PAGE_SIZE & (DEFAULT_PAGE_SIZE-1)) == 0) } - _map_file :: proc "contextless" (fd: uintptr, size: i64, flags: Map_File_Flags) -> (data: []byte, error: Map_File_Error) { #assert(i32(posix.Prot_Flag_Bits.READ) == i32(Map_File_Flag.Read)) #assert(i32(posix.Prot_Flag_Bits.WRITE) == i32(Map_File_Flag.Write))