Browse Source

sys/posix: add MAP_ANONYMOUS

Laytan Laats 9 months ago
parent
commit
20f4f378b2
2 changed files with 16 additions and 16 deletions
  1. 3 7
      core/mem/virtual/virtual_posix.odin
  2. 13 9
      core/sys/posix/sys_mman.odin

+ 3 - 7
core/mem/virtual/virtual_posix.odin

@@ -6,17 +6,13 @@ import "core:sys/posix"
 
 
 // Define non-posix needed flags:
 // Define non-posix needed flags:
 when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD {
 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 {
 } else when ODIN_OS == .OpenBSD || ODIN_OS == .NetBSD {
-	MAP_ANONYMOUS :: 0x1000
-
-	MADV_FREE     :: 6
+	MADV_FREE :: 6
 }
 }
 
 
 _reserve :: proc "contextless" (size: uint) -> (data: []byte, err: Allocator_Error) {
 _reserve :: proc "contextless" (size: uint) -> (data: []byte, err: Allocator_Error) {
-	flags  := posix.Map_Flags{ .PRIVATE } + transmute(posix.Map_Flags)i32(MAP_ANONYMOUS)
+	flags  := posix.Map_Flags{ .ANONYMOUS, .PRIVATE }
 	result := posix.mmap(nil, size, {}, flags)
 	result := posix.mmap(nil, size, {}, flags)
 	if result == posix.MAP_FAILED {
 	if result == posix.MAP_FAILED {
 		return nil, .Out_Of_Memory
 		return nil, .Out_Of_Memory

+ 13 - 9
core/sys/posix/sys_mman.odin

@@ -116,12 +116,14 @@ Prot_Flag_Bits :: enum c.int {
 Prot_Flags :: bit_set[Prot_Flag_Bits; c.int]
 Prot_Flags :: bit_set[Prot_Flag_Bits; c.int]
 
 
 Map_Flag_Bits :: enum c.int {
 Map_Flag_Bits :: enum c.int {
+	// Map anonymous memory.
+	ANONYMOUS = log2(MAP_ANONYMOUS),
 	// Interpret addr exactly.
 	// Interpret addr exactly.
-	FIXED   = log2(MAP_FIXED),
+	FIXED     = log2(MAP_FIXED),
 	// Changes are private.
 	// Changes are private.
-	PRIVATE = log2(MAP_PRIVATE),
+	PRIVATE   = log2(MAP_PRIVATE),
 	// Changes are shared.
 	// Changes are shared.
-	SHARED  = log2(MAP_SHARED),
+	SHARED    = log2(MAP_SHARED),
 }
 }
 Map_Flags :: bit_set[Map_Flag_Bits; c.int]
 Map_Flags :: bit_set[Map_Flag_Bits; c.int]
 
 
@@ -171,9 +173,10 @@ when ODIN_OS == .Darwin || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD || ODIN_OS
 	PROT_READ   :: 0x01
 	PROT_READ   :: 0x01
 	PROT_WRITE  :: 0x02
 	PROT_WRITE  :: 0x02
 
 
-	MAP_FIXED   :: 0x0010
-	MAP_PRIVATE :: 0x0002
-	MAP_SHARED  :: 0x0001
+	MAP_FIXED     :: 0x0010
+	MAP_PRIVATE   :: 0x0002
+	MAP_SHARED    :: 0x0001
+	MAP_ANONYMOUS :: 0x0020 when ODIN_OS == .Linux else 0x1000
 
 
 	when ODIN_OS == .Darwin || ODIN_OS == .Linux {
 	when ODIN_OS == .Darwin || ODIN_OS == .Linux {
 		MS_INVALIDATE :: 0x0002
 		MS_INVALIDATE :: 0x0002
@@ -207,9 +210,10 @@ when ODIN_OS == .Darwin || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD || ODIN_OS
 	PROT_READ   :: 0x01
 	PROT_READ   :: 0x01
 	PROT_WRITE  :: 0x02
 	PROT_WRITE  :: 0x02
 
 
-	MAP_FIXED   :: 0x0010
-	MAP_PRIVATE :: 0x0002
-	MAP_SHARED  :: 0x0001
+	MAP_FIXED     :: 0x0010
+	MAP_PRIVATE   :: 0x0002
+	MAP_SHARED    :: 0x0001
+	MAP_ANONYMOUS :: 0x1000
 
 
 	MS_ASYNC      :: 0x0001
 	MS_ASYNC      :: 0x0001
 	MS_INVALIDATE :: 0x0002
 	MS_INVALIDATE :: 0x0002