Compare commits

2 Commits
Author SHA1 Message Date
noselasd 075b049894 Missing commit 2026-09-10 13:13:24 +02:00
noselasd e34cadf6e7 Reorganize files to base/ folder 2026-09-10 13:11:41 +02:00
6 changed files with 54 additions and 88 deletions
+1 -2
View File
@@ -80,8 +80,7 @@ static INLINE void *arena_allocator_func(Allocator *allocator, AllocOperation op
case Alloc_Op_Aligned:
return arena_push(allocator->data, size, align);
case Alloc_Op_Free: // can't free from an arena
NotImplemented;
case Alloc_Op_Free: // can't free from an marena
return NULL;
case Alloc_Op_Free_All:
-2
View File
@@ -102,11 +102,9 @@ static INLINE void *marena_allocator_func(Allocator *allocator, AllocOperation o
return marena_push_aligned(allocator->data, size, align);
case Alloc_Op_Free: // can't free/Free_all from an marena
NotImplemented;
return NULL;
case Alloc_Op_Free_All:
marena_reset(allocator->data);
return NULL;
}
+1 -1
View File
@@ -30,7 +30,7 @@ static void *platform_allocator_func(Allocator *allocator, AllocOperation operat
case Alloc_Op_Aligned:
return aligned_alloc(size, align);
case Alloc_Op_Free:
case Alloc_Op_Free: // can't free/Free_all from an marena
free(memory);
return NULL;
+20 -26
View File
@@ -1,35 +1,33 @@
#include "pool.h"
APool *apool_create_ex(Allocator *allocator, const APoolCreateOptions *options)
APool *apool_create_ex(Allocator *allocator, U32 n_elements, U32 element_size, U32 element_align)
{
Assert(IsPow2(options->element_align));
U32 element_align = options->element_align;
Assert(IsPow2(element_align));
U32 align = element_align;
if (element_align < alignof(APoolElement)) {
element_align = alignof(APoolElement);
}
U32 element_size = AlignUp(options->element_size, options->element_align);
U32 size = AlignUp(element_size, element_align);
APool *pool = allocator_push_type(allocator, APool);
Assert(pool != NULL);
pool->element_align= element_align;
pool->element_size = element_size;
pool->allocator = allocator;
pool->n_elements = 0;
pool->n_free = 0;
pool->free_list = NULL;
pool->flags = options->flags;
pool->align = align;
pool->element_size = size;
pool->allocator = allocator;
pool->n_elements = n_elements;
pool->free_list = NULL;
pool->start = NULL;
if (options->n_reserved != 0) {
Assert(options->n_reserved <= U32_Max / element_size );
U32 total_size = options->n_reserved * element_size;
U8 *start = allocator_push(allocator, total_size, element_align);
for (U32 i = 0; i < total_size; i += element_size) {
if (size != APOOL_AUTOGROW) {
Assert(n_elements <= U32_Max / size );
U32 total_size = n_elements * size;
U8 * start = allocator_push(allocator, total_size, align);
for (U32 i = 0; i < total_size; i += size) {
APoolElement *element = (APoolElement *)&start[i];
element->next = pool->free_list;
pool->free_list = element;
pool->n_elements++;
}
pool->n_free = pool->n_elements;
pool->start = start;
}
return pool;
@@ -40,12 +38,8 @@ void *apool_alloc(APool *pool)
APoolElement *element = pool->free_list;
if (element != NULL) {
pool->free_list = element->next;
pool->n_free--;
} else if((pool->flags & APoolFlag_AutoGrow) != 0) {
element = allocator_push(pool->allocator, pool->element_size, pool->element_align);
if (element != NULL) {
pool->n_elements++;
}
} else if(pool->n_elements == APOOL_AUTOGROW) {
element = allocator_push(pool->allocator, pool->element_size, pool->align);
}
return element;
@@ -54,10 +48,10 @@ void *apool_alloc(APool *pool)
void apool_free(APool *pool, void *ptr)
{
if (ptr != NULL) {
Assert((U8 *)ptr >= pool->start);
APoolElement *element = (APoolElement *)ptr;
element->next = pool->free_list;
pool->free_list = element;
pool->n_free++;
}
}
+10 -19
View File
@@ -1,10 +1,6 @@
#pragma once
#include "core.h"
enum {
APoolFlag_AutoGrow = (1 << 0)
};
typedef U32 APoolFlags;
typedef union APoolElement APoolElement;
union APoolElement {
APoolElement *next; // offset from start to next free block (when not allocated)
@@ -13,23 +9,18 @@ union APoolElement {
typedef struct APool APool;
struct APool {
APoolElement *free_list; // free list
U8 *start; // start of user buffer
Allocator *allocator;
APoolFlags flags;
U32 element_size; // aligned size of each element
U32 element_align; // alignment
U32 n_elements; // total elements in the pool
U32 n_free; // number of free elements
U32 element_size; // aligned size of each block
U32 n_elements; // total number of blocks
U32 align; // alignment
};
enum {
APOOL_AUTOGROW = 0
};
typedef struct APoolCreateOptions APoolCreateOptions;
struct APoolCreateOptions {
U32 element_size; // aligned size of each element
U32 element_align; // alignment of elements
U32 n_reserved; // number of elements reserved
APoolFlags flags;
};
#define apool_create(arena, n_reserved, type) \
apool_create_ex(arena, &(APoolCreateOptions){sizeof(type), alignof(type), n_reserved, 0})
APool *apool_create_ex(Allocator *allocator, const APoolCreateOptions *options);
#define apool_create(arena, n_elements, type) \
apool_create_ex(arena, n_elements, sizeof(type), alignof(type));
APool *apool_create_ex(Allocator *allocator, U32 n_elements, U32 element_size, uint32_t element_align);
void *apool_alloc(APool *pool);
void apool_free(APool *pool, void *element);
+22 -38
View File
@@ -26,7 +26,7 @@ void arena_dump(const Arena *arena)
}
static void arena_test_1(void)
{
TRACEF("\n\n");
TRACEF("\n");
ArenaOptions arena_params = {};
U32 arena_size = MB(1) + MemoryBlock_Header_Size;
U32 commit_size = KB(8);
@@ -53,7 +53,7 @@ static void arena_test_1(void)
static void arena_test_2(void)
{
TRACEF("\n\n");
TRACEF("\n");
ArenaOptions arena_params = {};
U32 arena_size = MB(3) + MemoryBlock_Header_Size;
@@ -106,7 +106,7 @@ static void arena_test_2(void)
static void arena_test_3(void)
{
TRACEF("\n\n");
TRACEF("\n");
ArenaOptions arena_params = {};
U32 arena_size = KB(97) + MemoryBlock_Header_Size;
@@ -134,7 +134,7 @@ static void arena_test_3(void)
// gap was not accounted for. After the fix this should allocate a larger block.
static void arena_test_4(void)
{
TRACEF("\n\n");
TRACEF("\n");
U32 page_size = platform_page_size();
ArenaOptions arena_params = {};
@@ -167,7 +167,7 @@ static void arena_test_4(void)
static void arena_test_allocator_interface(void)
{
TRACEF("\n\n");
TRACEF("\n");
U32 page_size = platform_page_size();
ArenaOptions arena_params = {};
@@ -203,7 +203,7 @@ static void arena_test_allocator_interface(void)
static void arena_test_decommit(void)
{
TRACEF("\n\n");
TRACEF("\n");
U32 page_size = platform_page_size();
ArenaOptions arena_params = {};
@@ -230,7 +230,7 @@ static void arena_test_decommit(void)
void miniarena_test1(void)
{
TRACEF("\n\n");
TRACEF("\n");
#define arena_size 4096
MARENA_DEFINE(arena, arena_size, 8);
@@ -269,18 +269,12 @@ struct PoolTest{
void apool_test(void)
{
TRACEF("\n\n");
TRACEF("\n");
Arena arena;
arena_init(&arena, &ArenaOptions_Default);
Allocator allocator = arena_allocator(&arena);
APoolCreateOptions opts = {
.n_reserved= 16,
.element_size = sizeof(PoolTest),
.element_align = alignof(PoolTest),
.flags = 0
};
APool *pool = apool_create_ex(&allocator, &opts);
APool *pool = apool_create_ex(&allocator, 16, sizeof(PoolTest), alignof(PoolTest));
PoolTest *list = NULL;
for (U32 i = 0; i < U32_Max; i++) {
PoolTest *pt = apool_alloc(pool);
@@ -303,7 +297,6 @@ void apool_test(void)
printf("Pooltest freeing %u\n",p->n);
apool_free(pool, p);
}
printf("Pooltest total: %u free %u\n", pool->n_elements, pool->n_free);
list = NULL;
for (U32 i = 0; i < U32_Max; i++) {
PoolTest *pt = apool_alloc(pool);
@@ -323,13 +316,13 @@ void apool_test(void)
void apool_test_miniarena(void)
{
TRACEF("\n\n");
TRACEF("\n");
MArena arena;
U8 data[4096];
marena_init(&arena, data, sizeof data);
Allocator allocator = marena_allocator(&arena);
APool *pool = apool_create(&allocator, 16, PoolTest);
APool *pool = apool_create_ex(&allocator, 16, sizeof(PoolTest), alignof(PoolTest));
PoolTest *list = NULL;
for (U32 i = 0; i < U32_Max; i++) {
PoolTest *pt = apool_alloc(pool);
@@ -365,26 +358,19 @@ void apool_test_miniarena(void)
for (PoolTest *p = list; p; p = p->next){
printf("Pooltest %u\n",p->n);
}
printf("Pooltest total: %u free %u\n", pool->n_elements, pool->n_free);
allocator_free_all(&allocator);
}
void apool_test_autogrow(void)
{
TRACEF("\n\n");
TRACEF("\n");
Arena arena;
arena_init(&arena, &ArenaOptions_Default);
Allocator allocator = arena_allocator(&arena);
APoolCreateOptions opts = {
.n_reserved = 0,
.element_size = sizeof(PoolTest),
.element_align = alignof(PoolTest),
.flags = APoolFlag_AutoGrow
};
APool *pool = apool_create_ex(&allocator, &opts);
APool *pool = apool_create(&allocator, APOOL_AUTOGROW, PoolTest);
PoolTest *list = NULL;
for (U32 i = 0; i < 4; i++) {
PoolTest *pt = apool_alloc(pool);
@@ -398,7 +384,6 @@ void apool_test_autogrow(void)
for (PoolTest *p = list; p; p = p->next){
printf("Pooltest %u\n",p->n);
}
printf("Pooltest total: %u free %u\n", pool->n_elements, pool->n_free);
PoolTest *next;
U32 count = 0;
@@ -421,7 +406,6 @@ void apool_test_autogrow(void)
for (PoolTest *p = list; p; p = p->next){
printf("Pooltest %u\n",p->n);
}
printf("Pooltest total: %u free %u\n", pool->n_elements, pool->n_free);
allocator_free_all(&allocator);
arena_free(&arena);
@@ -430,7 +414,7 @@ void apool_test_autogrow(void)
void string_test_1(void)
{
TRACEF("\n\n");
TRACEF("\n");
Str str1 = S("Hello");
printf("str1: %.*s len %d\n", str1.len, str1.str, str1.len);
@@ -447,7 +431,7 @@ void string_test_1(void)
void string_split_test_1(void)
{
TRACEF("\n\n");
TRACEF("\n");
Str str1 = S("|a:bb|ccc|");
Str sep = S("|:");
@@ -461,7 +445,7 @@ void string_split_test_1(void)
}
void string_test_misc(void)
{
TRACEF("\n\n");
TRACEF("\n");
Str str1 = S("Hello World");
bool prefix1 = str_starts_with(str1, S("He"));
@@ -500,7 +484,7 @@ void string_test_misc(void)
}
void string_test_join(void)
{
TRACEF("\n\n");
TRACEF("\n");
Arena arena;
arena_init(&arena, &ArenaOptions_Default);
Allocator allocator = arena_allocator(&arena);
@@ -531,7 +515,7 @@ void print_runes(Str str)
void string_test_utf8(void)
{
TRACEF("\n\n");
TRACEF("\n");
Str str1 = S("Test 1ø2 ☺");
@@ -555,7 +539,7 @@ void string_test_utf8(void)
void string_test_hex(void)
{
TRACEF("\n\n");
TRACEF("\n");
MArena arena;
U8 data[4096];
@@ -593,7 +577,7 @@ struct StrSList {
void string_test_slist(void)
{
TRACEF("\n\n");
TRACEF("\n");
Str str1 = S("one");
Str str2 = S("two");
@@ -641,7 +625,7 @@ struct StrDList {
void string_test_dlist(void)
{
TRACEF("\n\n");
TRACEF("\n");
Str str1 = S("one");
Str str2 = S("two");