SomeGameEngineV2/engine/memory.c

82 lines
2.4 KiB
C

#include "memory.h"
#include "engine_conf.h"
#include <stdio.h>
#include <assert.h>
void init_memory_system(void)
{
mem_arena_init(MEMORY_ARENA_SIZE_MB);
for (uint32_t i = 0; i < mem_impl.n_components; ++i)
{
memset(mem_impl.comp_mempools[i].buffer, 0, mem_impl.comp_mempools[i].elem_size * mem_impl.comp_mempools[i].capacity);
cc_init(&mem_impl.comp_mempools[i].free_set);
for (size_t j = 0; j < mem_impl.comp_mempools[i].capacity; ++j)
{
cc_insert(&mem_impl.comp_mempools[i].free_set, j);
}
}
}
void free_memory_system(void)
{
for (uint32_t i = 0; i < mem_impl.n_components; ++i)
{
cc_cleanup(&mem_impl.comp_mempools[i].free_set);
}
mem_arena_deinit();
}
void print_memory_info()
{
mem_arena_print();
printf("Component Free Pool\n");
printf("===================\n");
for (size_t i = 0; i < mem_impl.n_components; ++i)
{
printf(
"%lu: %lu\n",
i, cc_size(&mem_impl.comp_mempools[i].free_set)
);
}
printf("===================\n");
}
void* new_component_generic(unsigned int comp_type, unsigned int* idx)
{
assert(comp_type < N_COMPONENTS);
assert(comp_type < mem_impl.n_components);
if (cc_size(&mem_impl.comp_mempools[comp_type].free_set) == 0) return NULL;
*idx = *cc_first(&mem_impl.comp_mempools[comp_type].free_set);
cc_erase(&mem_impl.comp_mempools[comp_type].free_set, *idx);
void* comp = mem_impl.comp_mempools[comp_type].buffer
+ (*idx * mem_impl.comp_mempools[comp_type].elem_size);
memset(comp, 0, mem_impl.comp_mempools[comp_type].elem_size);
return comp;
}
void* get_component_generic(unsigned int comp_type, unsigned int idx)
{
void * comp = NULL;
assert(comp_type < mem_impl.n_components);
if (idx >= mem_impl.comp_mempools->capacity) return NULL;
if (cc_get(&mem_impl.comp_mempools[comp_type].free_set, idx) == NULL)
{
comp = mem_impl.comp_mempools[comp_type].buffer + (idx * mem_impl.comp_mempools[comp_type].elem_size);
}
return comp;
}
void free_component_generic(unsigned int comp_type, unsigned int idx)
{
assert(comp_type < N_COMPONENTS);
// This just free the component from the memory pool
assert(comp_type < mem_impl.n_components);
if (idx >= mem_impl.comp_mempools->capacity) return;
cc_get_or_insert(&mem_impl.comp_mempools[comp_type].free_set, idx);
}