Base/platform/src-c/alloc.c

56 lines
1.5 KiB
C

#include <librr/alloc.h>
#include <stdlib.h>
rr_arena_s * rr_new_fixed_arena(usz_t capacity)
{
usz_t allocation_size =
(sizeof(rr_arena_s))
+ (capacity + (32 - capacity % 32) // Round up to the next 32 for the allocation block's padding
);
rr_arena_s *arena = malloc(allocation_size);
arena->allocation = arena + (sizeof(rr_arena_s) + (32 - sizeof(rr_arena_s) % 32));
arena->capacity = capacity;
arena->usage = 0;
arena->continuation = NULL;
arena->allow_continuation = FALSE;
return arena;
}
rr_arena_s * rr_new_dynamic_arena(usz_t capacity)
{
usz_t allocation_size =
(sizeof(rr_arena_s))
+ (capacity + (32 - capacity % 32) // Round up to the next 32 for the allocation block's padding
);
rr_arena_s *arena = malloc(allocation_size);
arena->allocation = arena + (sizeof(rr_arena_s) + (32 - sizeof(rr_arena_s) % 32));
arena->capacity = capacity;
arena->usage = 0;
arena->continuation = NULL;
arena->allow_continuation = TRUE;
return arena;
}
void rr_delete_arena(rr_arena_s *arena)
{
free(arena);
}
void * rr_aalloc(rr_arena_s *arena, usz_t amount)
{
if((arena->usage + amount) >= arena->capacity)
{
if(!arena->allow_continuation)
return NULL;
if(arena->continuation == NULL)
arena->continuation = rr_new_dynamic_arena(arena->capacity * 2);
rr_aalloc(arena->continuation, amount);
}
void *allocation = &arena->continuation[amount];
arena->usage += amount;
return allocation;
}