diff --git a/core/mem/allocators.odin b/core/mem/allocators.odin index d7e3cfbfd..1efc60033 100644 --- a/core/mem/allocators.odin +++ b/core/mem/allocators.odin @@ -56,6 +56,7 @@ init_arena :: proc(a: ^Arena, data: []byte) { a.temp_count = 0 } +@(require_results) arena_alloc :: proc(a: ^Arena, size: int, alignment := DEFAULT_ALIGNMENT) -> ([]byte, Allocator_Error) { bytes, err := arena_alloc_non_zeroed(a, size, alignment) if bytes != nil { @@ -64,6 +65,7 @@ arena_alloc :: proc(a: ^Arena, size: int, alignment := DEFAULT_ALIGNMENT) -> ([] return bytes, err } +@(require_results) arena_alloc_non_zeroed :: proc(a: ^Arena, size: int, alignment := DEFAULT_ALIGNMENT) -> ([]byte, Allocator_Error) { #no_bounds_check end := &a.data[a.offset] ptr := align_forward(end, uintptr(alignment)) @@ -173,6 +175,7 @@ scratch_destroy :: proc(s: ^Scratch) { s^ = {} } +@(require_results) scratch_alloc :: proc( s: ^Scratch, size: int, @@ -186,6 +189,7 @@ scratch_alloc :: proc( return bytes, err } +@(require_results) scratch_alloc_non_zeroed :: proc( s: ^Scratch, size: int, @@ -239,6 +243,7 @@ scratch_alloc_non_zeroed :: proc( return ptr, err } +@(require_results) scratch_free :: proc(s: ^Scratch, ptr: rawptr, loc := #caller_location) -> Allocator_Error { if s.data == nil { panic("Free on an uninitialized scratch allocator", loc) @@ -283,6 +288,7 @@ scratch_free_all :: proc(s: ^Scratch, loc := #caller_location) { clear(&s.leaked_allocations) } +@(require_results) scratch_resize :: proc( s: ^Scratch, old_memory: rawptr, @@ -298,6 +304,7 @@ scratch_resize :: proc( return bytes, err } +@(require_results) scratch_resize_non_zeroed :: proc( s: ^Scratch, old_memory: rawptr, @@ -404,6 +411,7 @@ init_stack :: proc(s: ^Stack, data: []byte) { s.peak_used = 0 } +@(require_results) stack_alloc :: proc( s: ^Stack, size: int, @@ -417,6 +425,7 @@ stack_alloc :: proc( return bytes, err } +@(require_results) stack_alloc_non_zeroed :: proc( s: ^Stack, size: int, @@ -446,6 +455,7 @@ stack_alloc_non_zeroed :: proc( return byte_slice(rawptr(next_addr), size), nil } +@(require_results) stack_free :: proc( s: ^Stack, old_memory: rawptr, @@ -486,6 +496,7 @@ stack_free_all :: proc(s: ^Stack, loc := #caller_location) { s.curr_offset = 0 } +@(require_results) stack_resize :: proc( s: ^Stack, old_memory: rawptr, @@ -505,6 +516,7 @@ stack_resize :: proc( return bytes, err } +@(require_results) stack_resize_non_zeroed :: proc( s: ^Stack, old_memory: rawptr, @@ -626,6 +638,7 @@ small_stack_allocator :: proc(stack: ^Small_Stack) -> Allocator { } } +@(require_results) small_stack_alloc :: proc( s: ^Small_Stack, size: int, @@ -639,6 +652,7 @@ small_stack_alloc :: proc( return bytes, err } +@(require_results) small_stack_alloc_non_zeroed :: proc( s: ^Small_Stack, size: int, @@ -664,6 +678,7 @@ small_stack_alloc_non_zeroed :: proc( return byte_slice(rawptr(next_addr), size), nil } +@(require_results) small_stack_free :: proc( s: ^Small_Stack, old_memory: rawptr, @@ -693,6 +708,7 @@ small_stack_free_all :: proc(s: ^Small_Stack) { s.offset = 0 } +@(require_results) small_stack_resize :: proc( s: ^Small_Stack, old_memory: rawptr, @@ -712,6 +728,7 @@ small_stack_resize :: proc( return bytes, err } +@(require_results) small_stack_resize_non_zeroed :: proc( s: ^Small_Stack, old_memory: rawptr, @@ -932,8 +949,8 @@ dynamic_arena_reset :: proc(a: ^Dynamic_Arena, loc := #caller_location) { append(&a.unused_blocks, block, loc=loc) } clear(&a.used_blocks) - for a in a.out_band_allocations { - free(a, a.block_allocator, loc=loc) + for allocation in a.out_band_allocations { + free(allocation, a.block_allocator, loc=loc) } clear(&a.out_band_allocations) a.bytes_left = 0 // Make new allocations call `_dynamic_arena_cycle_new_block` again. @@ -947,6 +964,7 @@ dynamic_arena_free_all :: proc(a: ^Dynamic_Arena, loc := #caller_location) { clear(&a.unused_blocks) } +@(require_results) dynamic_arena_resize :: proc( a: ^Dynamic_Arena, old_memory: rawptr, @@ -965,6 +983,7 @@ dynamic_arena_resize :: proc( return bytes, err } +@(require_results) dynamic_arena_resize_non_zeroed :: proc( a: ^Dynamic_Arena, old_memory: rawptr, @@ -1014,8 +1033,8 @@ dynamic_arena_allocator_proc :: proc( case .Query_Info: info := (^Allocator_Query_Info)(old_memory) if info != nil && info.pointer != nil { - info.size = pool.block_size - info.alignment = pool.alignment + info.size = arena.block_size + info.alignment = arena.alignment return byte_slice(info, size_of(info^)), nil } return nil, nil @@ -1033,7 +1052,6 @@ panic_allocator_proc :: proc( old_size: int, loc := #caller_location, ) -> ([]byte, Allocator_Error) { - switch mode { case .Alloc: if size > 0 { @@ -1057,7 +1075,6 @@ panic_allocator_proc :: proc( } case .Free_All: panic("mem: panic allocator, .Free_All called", loc=loc) - case .Query_Features: set := (^Allocator_Mode_Set)(old_memory) if set != nil { @@ -1068,7 +1085,6 @@ panic_allocator_proc :: proc( case .Query_Info: panic("mem: panic allocator, .Query_Info called", loc=loc) } - return nil, nil } @@ -1080,6 +1096,8 @@ panic_allocator :: proc() -> Allocator { } } + + Buddy_Block :: struct #align(align_of(uint)) { size: uint, is_free: bool,