#include "memory.h" #include "engine_conf.h" #include #include 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); }