mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-07 08:08:50 +00:00
Move memory mutex guard around for resize in virtual.Arena allocator
This commit is contained in:
@@ -108,6 +108,16 @@ arena_alloc :: proc(arena: ^Arena, size: uint, alignment: uint, loc := #caller_l
|
|||||||
}
|
}
|
||||||
|
|
||||||
sync.mutex_guard(&arena.mutex)
|
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 {
|
switch arena.kind {
|
||||||
case .Growing:
|
case .Growing:
|
||||||
@@ -345,7 +355,11 @@ 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:
|
}
|
||||||
|
|
||||||
|
sync.mutex_guard(&arena.mutex)
|
||||||
|
|
||||||
|
if uintptr(old_data) & uintptr(alignment-1) == 0 {
|
||||||
if size < old_size {
|
if size < old_size {
|
||||||
// shrink data in-place
|
// shrink data in-place
|
||||||
data = old_data[:size]
|
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 {
|
if new_memory == nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user