/* The default arena allocator Odin provides does fragmented resizes even for the last most allocated block getting resized. This is an alternative to alleviates that. */ package sectr import "core:mem" // Initialize a sub-section of our virtual memory as a sub-arena sub_arena_init :: proc( address : ^byte, size : int ) -> ( ^ Arena) { Arena :: mem.Arena arena_size :: size_of( Arena) sub_arena := cast( ^ Arena ) address mem_slice := slice_ptr( ptr_offset( address, arena_size), size ) arena_init( sub_arena, mem_slice ) return sub_arena } // TODO(Ed) : Once this is done (ArenaFixed), rename to just Arena as we're not going to use the core implementation ArenaFixedHeader :: struct { data : []byte, offset : uint, peak_used : uint, } ArenaFixed :: struct { using header : ^ArenaFixedHeader, } arena_fixed_init :: proc( backing : []byte ) -> (arena : ArenaFixed) { header_size := size_of(ArenaFixedHeader) verify(len(backing) >= (header_size + Kilobyte), "Attempted to init an arena with less than kilobyte of memory...") arena.header = cast(^ArenaFixedHeader) raw_data(backing) using arena.header data_ptr := cast([^]byte) (cast( [^]ArenaFixedHeader) arena.header)[ 1:] data = slice_ptr( data_ptr, len(backing) - header_size ) offset = 0 peak_used = 0 return } arena_fixed_allocator_proc :: proc( allocator_data : rawptr, mode : AllocatorMode, size : int, alignment : int, old_memory : rawptr, old_size : int, location := #caller_location ) -> ([]byte, AllocatorError) { return nil, .Out_Of_Memory }