82 lines
2.4 KiB
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);
|
|
}
|