aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgingerBill <gingerBill@users.noreply.github.com>2025-09-27 10:27:08 +0100
committergingerBill <gingerBill@users.noreply.github.com>2025-09-27 10:27:08 +0100
commita7af6055b00e6f6d47d454ad91591abad9e1ea2d (patch)
treebd3f492a16cbf6ad6274e1f8e06998d48c7ec30f
parent2c97b4ee4d1867d31467f9c25503260e4a76c5dc (diff)
Move memory mutex guard around for resize in virtual.Arena allocator
-rw-r--r--core/mem/virtual/arena.odin18
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
}