Implement Allocator wrapper for Arena
This commit is contained in:
parent
5b8e9f8be6
commit
03d2a59948
@ -2,6 +2,7 @@
|
|||||||
#define MEM_ARENA_H
|
#define MEM_ARENA_H
|
||||||
|
|
||||||
#include "aliases.h"
|
#include "aliases.h"
|
||||||
|
#include "mem_allocator.h"
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
@ -10,6 +11,7 @@ extern "C" {
|
|||||||
|
|
||||||
typedef struct growing_arena Arena;
|
typedef struct growing_arena Arena;
|
||||||
|
|
||||||
|
Allocator wapp_mem_arena_allocator(Arena *arena);
|
||||||
bool wapp_mem_arena_init(Arena **arena, u64 base_capacity);
|
bool wapp_mem_arena_init(Arena **arena, u64 base_capacity);
|
||||||
void *wapp_mem_arena_alloc(Arena *arena, u64 size);
|
void *wapp_mem_arena_alloc(Arena *arena, u64 size);
|
||||||
void *wapp_mem_arena_alloc_aligned(Arena *arena, u64 size, u64 alignment);
|
void *wapp_mem_arena_alloc_aligned(Arena *arena, u64 size, u64 alignment);
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
#include "mem_arena.h"
|
#include "mem_arena.h"
|
||||||
#include "aliases.h"
|
#include "aliases.h"
|
||||||
|
#include "mem_allocator.h"
|
||||||
#include "mem_utils.h"
|
#include "mem_utils.h"
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
@ -49,8 +50,25 @@ internal void base_arena_clear(BaseArena *arena);
|
|||||||
internal void base_arena_free(BaseArena *arena);
|
internal void base_arena_free(BaseArena *arena);
|
||||||
internal ArenaAllocHDR *find_alloc_header(BaseArena *arena, void *alloc_ptr);
|
internal ArenaAllocHDR *find_alloc_header(BaseArena *arena, void *alloc_ptr);
|
||||||
|
|
||||||
|
internal void *mem_arena_alloc(u64 size, void *alloc_obj);
|
||||||
|
internal void *mem_arena_alloc_aligned(u64 size, u64 alignment, void *alloc_obj);
|
||||||
|
internal void *mem_arena_realloc(void *ptr, u64 size, void *alloc_obj);
|
||||||
|
internal void *mem_arena_realloc_aligned(void *ptr, u64 size, u64 alignment,
|
||||||
|
void *alloc_obj);
|
||||||
|
|
||||||
// PUBLIC API
|
// PUBLIC API
|
||||||
|
|
||||||
|
Allocator wapp_mem_arena_allocator(Arena *arena) {
|
||||||
|
return (Allocator){
|
||||||
|
.obj = (void *)arena,
|
||||||
|
.alloc = mem_arena_alloc,
|
||||||
|
.alloc_aligned = mem_arena_alloc_aligned,
|
||||||
|
.realloc = mem_arena_realloc,
|
||||||
|
.realloc_aligned = mem_arena_realloc_aligned,
|
||||||
|
.free = NULL,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
bool wapp_mem_arena_init(Arena **arena, u64 base_capacity) {
|
bool wapp_mem_arena_init(Arena **arena, u64 base_capacity) {
|
||||||
if (!arena || *arena || base_capacity == 0) {
|
if (!arena || *arena || base_capacity == 0) {
|
||||||
return false;
|
return false;
|
||||||
@ -337,7 +355,7 @@ internal ArenaAllocHDR *find_alloc_header(BaseArena *arena, void *alloc_ptr) {
|
|||||||
max_search_end > arena_buf_start ? max_search_end : arena_buf_start;
|
max_search_end > arena_buf_start ? max_search_end : arena_buf_start;
|
||||||
|
|
||||||
bool match;
|
bool match;
|
||||||
for (; current >= search_end; --current) {
|
for (; current >= search_end; --current) {
|
||||||
match = true;
|
match = true;
|
||||||
|
|
||||||
for (u64 i = 0; i < HDR_MAGIC_BYTE_COUNT; ++i) {
|
for (u64 i = 0; i < HDR_MAGIC_BYTE_COUNT; ++i) {
|
||||||
@ -350,7 +368,32 @@ internal ArenaAllocHDR *find_alloc_header(BaseArena *arena, void *alloc_ptr) {
|
|||||||
if (match) {
|
if (match) {
|
||||||
return (ArenaAllocHDR *)current;
|
return (ArenaAllocHDR *)current;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal void *mem_arena_alloc(u64 size, void *alloc_obj) {
|
||||||
|
Arena *arena = (Arena *)alloc_obj;
|
||||||
|
|
||||||
|
return wapp_mem_arena_alloc(arena, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal void *mem_arena_alloc_aligned(u64 size, u64 alignment, void *alloc_obj) {
|
||||||
|
Arena *arena = (Arena *)alloc_obj;
|
||||||
|
|
||||||
|
return wapp_mem_arena_alloc_aligned(arena, size, alignment);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal void *mem_arena_realloc(void *ptr, u64 size, void *alloc_obj) {
|
||||||
|
Arena *arena = (Arena *)alloc_obj;
|
||||||
|
|
||||||
|
return wapp_mem_arena_realloc(arena, ptr, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal void *mem_arena_realloc_aligned(void *ptr, u64 size, u64 alignment,
|
||||||
|
void *alloc_obj) {
|
||||||
|
Arena *arena = (Arena *)alloc_obj;
|
||||||
|
|
||||||
|
return wapp_mem_arena_realloc_aligned(arena, ptr, size, alignment);
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user