From a35d6a6f8d726cbf31e639313d920c30c9893190 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 12 Sep 2022 17:06:32 +0100 Subject: [PATCH] Improve mem/virtual handling of out of memory on Windows --- core/mem/virtual/virtual.odin | 4 ++-- core/mem/virtual/virtual_windows.odin | 8 +++++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/core/mem/virtual/virtual.odin b/core/mem/virtual/virtual.odin index 21ab5ef21..22e96f6bd 100644 --- a/core/mem/virtual/virtual.odin +++ b/core/mem/virtual/virtual.odin @@ -63,6 +63,7 @@ memory_block_alloc :: proc(committed, reserved: uint, flags: Memory_Block_Flags) } page_size := DEFAULT_PAGE_SIZE + assert(mem.is_power_of_two(uintptr(page_size))) committed := committed committed = clamp(committed, 0, reserved) @@ -82,8 +83,7 @@ memory_block_alloc :: proc(committed, reserved: uint, flags: Memory_Block_Flags) pmblock := platform_memory_alloc(0, total_size) or_return pmblock.block.base = ([^]byte)(uintptr(pmblock) + base_offset) - commit_err := platform_memory_commit(pmblock, uint(base_offset) + committed) - assert(commit_err == nil) + platform_memory_commit(pmblock, uint(base_offset) + committed) or_return // Should be zeroed assert(pmblock.block.used == 0) diff --git a/core/mem/virtual/virtual_windows.odin b/core/mem/virtual/virtual_windows.odin index ef0bf6f1a..bbd74a925 100644 --- a/core/mem/virtual/virtual_windows.odin +++ b/core/mem/virtual/virtual_windows.odin @@ -51,6 +51,7 @@ PAGE_TARGETS_INVALID :: 0x40000000 PAGE_TARGETS_NO_UPDATE :: 0x40000000 ERROR_INVALID_ADDRESS :: 487 +ERROR_COMMITMENT_LIMIT :: 1455 @(default_calling_convention="stdcall") foreign Kernel32 { @@ -76,12 +77,13 @@ _commit :: proc "contextless" (data: rawptr, size: uint) -> Allocator_Error { result := VirtualAlloc(data, size, MEM_COMMIT, PAGE_READWRITE) if result == nil { switch err := GetLastError(); err { - case ERROR_INVALID_ADDRESS: + case 0: + return .Invalid_Argument + case ERROR_INVALID_ADDRESS, ERROR_COMMITMENT_LIMIT: return .Out_Of_Memory } - // TODO(bill): Handle errors correctly - return .Invalid_Argument + return .Out_Of_Memory } return nil }