diff options
| author | gingerBill <gingerBill@users.noreply.github.com> | 2025-09-27 10:27:08 +0100 |
|---|---|---|
| committer | gingerBill <gingerBill@users.noreply.github.com> | 2025-09-27 10:27:08 +0100 |
| commit | a7af6055b00e6f6d47d454ad91591abad9e1ea2d (patch) | |
| tree | bd3f492a16cbf6ad6274e1f8e06998d48c7ec30f | |
| parent | 2c97b4ee4d1867d31467f9c25503260e4a76c5dc (diff) | |
Move memory mutex guard around for resize in virtual.Arena allocator
| -rw-r--r-- | core/mem/virtual/arena.odin | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/core/mem/virtual/arena.odin b/core/mem/virtual/arena.odin index 4f7bd445d..b515aa3cf 100644 --- a/core/mem/virtual/arena.odin +++ b/core/mem/virtual/arena.odin @@ -108,6 +108,16 @@ arena_alloc :: proc(arena: ^Arena, size: uint, alignment: uint, loc := #caller_l } sync.mutex_guard(&arena.mutex) + return arena_alloc_unguarded(arena, size, alignment, loc) +} + +// Allocates memory from the provided arena. +@(require_results, no_sanitize_address, private) +arena_alloc_unguarded :: proc(arena: ^Arena, size: uint, alignment: uint, loc := #caller_location) -> (data: []byte, err: Allocator_Error) { + size := size + if size == 0 { + return nil, nil + } switch arena.kind { case .Growing: @@ -345,7 +355,11 @@ arena_allocator_proc :: proc(allocator_data: rawptr, mode: mem.Allocator_Mode, case size == 0: err = .Mode_Not_Implemented return - case uintptr(old_data) & uintptr(alignment-1) == 0: + } + + sync.mutex_guard(&arena.mutex) + + if uintptr(old_data) & uintptr(alignment-1) == 0 { if size < old_size { // shrink data in-place data = old_data[:size] @@ -369,7 +383,7 @@ arena_allocator_proc :: proc(allocator_data: rawptr, mode: mem.Allocator_Mode, } } - new_memory := arena_alloc(arena, size, alignment, location) or_return + new_memory := arena_alloc_unguarded(arena, size, alignment, location) or_return if new_memory == nil { return } |