115 lines
3.1 KiB
C
115 lines
3.1 KiB
C
#pragma once
|
|
|
|
// ::Allocator::Util::Header::
|
|
|
|
static inline usize CalcPaddingWithHeader(uintptr ptr, uintptr alignment, usize header_size);
|
|
static inline usize CalcPadding(uintptr ptr, uintptr alignment);
|
|
|
|
// ::Allocator::Arena::Header::
|
|
|
|
#define ARENA_HEADER_SIZE 64
|
|
|
|
typedef struct Arena
|
|
{
|
|
u8 *buffer;
|
|
usize length;
|
|
usize pos;
|
|
u32 init_line_no;
|
|
} Arena;
|
|
|
|
typedef struct TempArena
|
|
{
|
|
Arena *arena;
|
|
u64 pos;
|
|
} TempArena;
|
|
|
|
static Arena *ArenaInit(rawptr buffer, usize size);
|
|
static Arena *ArenaCreate(usize size);
|
|
static Arena *ArenaCreateDebug(usize size, u32 init_line_no);
|
|
static Arena *ArenaInitDebug(rawptr buffer, usize size, u32 init_line_no);
|
|
static rawptr ArenaAllocAlign(Arena *arena, usize size, usize align);
|
|
static rawptr ArenaAlloc(Arena *arena, usize size);
|
|
static void ArenaFree(Arena *arena);
|
|
static void ArenaFreeZeroed(Arena *arena);
|
|
static void DeallocArena(Arena *arena);
|
|
|
|
// ::Allocator::GlobalAlloc::Header::
|
|
|
|
typedef struct AllocInfo
|
|
{
|
|
rawptr ptr;
|
|
struct AllocInfo *next;
|
|
} AllocInfo;
|
|
|
|
typedef struct Allocator
|
|
{
|
|
RBTree *tree;
|
|
RBTree *used_tree;
|
|
HashTable *hash_table;
|
|
rawptr buffer;
|
|
u64 size;
|
|
u64 free_size;
|
|
u64 grow_size;
|
|
} Allocator;
|
|
|
|
static void InitAllocator(usize init_size);
|
|
static void DeinitAlloc();
|
|
static void AllocGrow(usize size);
|
|
static rawptr Alloc(usize size);
|
|
static rawptr AllocAlign(usize size, usize alignment);
|
|
static void Free(rawptr ptr);
|
|
|
|
// ::Allocator::FreeList::Header::
|
|
|
|
typedef struct FLAllocHeader
|
|
{
|
|
usize size;
|
|
usize padding;
|
|
} FLAllocHeader;
|
|
|
|
typedef struct FLNode
|
|
{
|
|
struct FLNode *next;
|
|
usize size;
|
|
} FLNode;
|
|
|
|
typedef struct FreeList
|
|
{
|
|
rawptr data;
|
|
FLNode *head;
|
|
usize size;
|
|
usize used;
|
|
struct FreeList *next;
|
|
} FreeList;
|
|
|
|
typedef struct FLAlloc
|
|
{
|
|
FreeList *list_head;
|
|
TicketMut mut;
|
|
FLNode *nil;
|
|
usize grow_size;
|
|
} FLAlloc;
|
|
|
|
static void GlobalFreeListInit(usize size);
|
|
static rawptr FLMemAlloc(usize size);
|
|
static rawptr FLMemAllocZeroed(usize size);
|
|
static rawptr FLMemRealloc(rawptr old_ptr, usize size);
|
|
static void FLMemFree(rawptr ptr);
|
|
static usize FreeListPtrSize(FLAlloc *alloc, rawptr ptr);
|
|
static void FreeListInit(FLAlloc *alloc, usize size);
|
|
static rawptr FreeListAllocAlign(FLAlloc *alloc, usize size, usize alignment);
|
|
static rawptr FreeListAlloc(FLAlloc *alloc, usize size);
|
|
static void FreeListFree(FLAlloc *alloc, rawptr ptr);
|
|
static void FreeListFreeAll(FLAlloc *alloc);
|
|
static FreeList *FreeListGrow(FLAlloc *alloc, usize alloc_size);
|
|
static rawptr FreeListRealloc(FLAlloc *alloc, rawptr old_ptr, usize size);
|
|
static FLNode *FreeListSearch(FreeList *alloc, usize size, usize alignment, usize *out_padding, FLNode **prev_node);
|
|
static void FreeListCoalescence(FreeList *alloc, FLNode *prev_node, FLNode *free_node);
|
|
static void FreeListRemove(FLNode **head, FLNode *prev_node, FLNode *del_node);
|
|
static void FreeListInsert(FLNode **head, FLNode *prev_node, FLNode *new_node);
|
|
static FreeList *_FreeListFindList(FLAlloc *alloc, rawptr ptr);
|
|
static void _FreeListInit(FreeList **alloc, usize size);
|
|
static rawptr _FreeListAllocAlign(FreeList *alloc, usize size, usize alignment);
|
|
static void _FreeListFree(FreeList *alloc, rawptr ptr);
|
|
|