Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
075b049894 | ||
|
|
e34cadf6e7 |
+1
-2
@@ -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:
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user