From 19302e050676afff8d5f6ddafa2bd92fc58f187b Mon Sep 17 00:00:00 2001 From: jason Date: Wed, 12 Feb 2025 11:33:02 -0500 Subject: [PATCH] Fix issue #4834 The logic that determines whether we need to allocate more space does not account having to align the end forward for requested alignment. --- core/mem/virtual/arena.odin | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/core/mem/virtual/arena.odin b/core/mem/virtual/arena.odin index 5191505cfee..e2fb3668802 100644 --- a/core/mem/virtual/arena.odin +++ b/core/mem/virtual/arena.odin @@ -108,6 +108,14 @@ arena_alloc :: proc(arena: ^Arena, size: uint, alignment: uint, loc := #caller_l switch arena.kind { case .Growing: needed := mem.align_forward_uint(size, alignment) + if arena.curr_block != nil { + ptr := uintptr(arena.curr_block.base[arena.curr_block.used:]) + mask := uintptr(alignment)-1 + if ptr & mask != 0 { + needed += uint(uintptr(alignment) - (ptr & mask)) + } + } + if arena.curr_block == nil || (safe_add(arena.curr_block.used, needed) or_else 0) > arena.curr_block.reserved { if arena.minimum_block_size == 0 { arena.minimum_block_size = DEFAULT_ARENA_GROWING_MINIMUM_BLOCK_SIZE