|
@@ -328,10 +328,24 @@ arena_allocator_proc :: proc(allocator_data: rawptr, mode: mem.Allocator_Mode,
|
|
case size == 0:
|
|
case size == 0:
|
|
err = .Mode_Not_Implemented
|
|
err = .Mode_Not_Implemented
|
|
return
|
|
return
|
|
- case (uintptr(old_data) & uintptr(alignment-1) == 0) && size < old_size:
|
|
|
|
- // shrink data in-place
|
|
|
|
- data = old_data[:size]
|
|
|
|
- return
|
|
|
|
|
|
+ case uintptr(old_data) & uintptr(alignment-1) == 0:
|
|
|
|
+ if size < old_size {
|
|
|
|
+ // shrink data in-place
|
|
|
|
+ data = old_data[:size]
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if block := arena.curr_block; block != nil {
|
|
|
|
+ start := uint(uintptr(old_memory)) - uint(uintptr(block.base))
|
|
|
|
+ old_end := start + old_size
|
|
|
|
+ new_end := start + size
|
|
|
|
+ if start < old_end && old_end == block.used && new_end <= block.reserved {
|
|
|
|
+ // grow data in-place, adjusting next allocation
|
|
|
|
+ _ = alloc_from_memory_block(block, new_end - old_end, 1, default_commit_size=arena.default_commit_size) or_return
|
|
|
|
+ data = block.base[start:new_end]
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
new_memory := arena_alloc(arena, size, alignment, location) or_return
|
|
new_memory := arena_alloc(arena, size, alignment, location) or_return
|