56 lines
1.5 KiB
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;
|
|
}
|