|
|
|
|
@ -20,7 +20,7 @@ struct memory_pool* memory_pool_init(size_t object_size) {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Выделить объект из пула или из malloc
|
|
|
|
|
void* memory_pool_alloc(struct memory_pool* pool) { |
|
|
|
|
void* memory_pool_alloc_impl(struct memory_pool* pool, const char* location) { |
|
|
|
|
if (!pool) { |
|
|
|
|
return NULL; |
|
|
|
|
} |
|
|
|
|
@ -31,15 +31,17 @@ void* memory_pool_alloc(struct memory_pool* pool) {
|
|
|
|
|
pool->free_count--; |
|
|
|
|
pool->reuse_count++; |
|
|
|
|
memset(obj, 0, pool->object_size); // Опционально: очищаем память для безопасности
|
|
|
|
|
DEBUG_INFO(DEBUG_CATEGORY_MEMORY, "pool_alloc reused: %s, remaining=%zu", location, pool->free_count); |
|
|
|
|
return obj; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
pool->allocations++; |
|
|
|
|
return u_calloc(1, pool->object_size); // Используем calloc для инициализации нулями
|
|
|
|
|
DEBUG_INFO(DEBUG_CATEGORY_MEMORY, "pool_alloc: %s, total_allocs=%zu", location, pool->allocations); |
|
|
|
|
return u_calloc_impl(1, pool->object_size, location); // Используем calloc для инициализации нулями
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Освободить объект в пул или в free
|
|
|
|
|
void memory_pool_free(struct memory_pool* pool, void* obj) { |
|
|
|
|
void memory_pool_free_impl(struct memory_pool* pool, void* obj, const char* location) { |
|
|
|
|
if (!pool || !obj) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
@ -49,11 +51,13 @@ void memory_pool_free(struct memory_pool* pool, void* obj) {
|
|
|
|
|
*(void**)obj = pool->free_head; // Сохраняем next в начало блока
|
|
|
|
|
pool->free_head = obj; |
|
|
|
|
pool->free_count++; |
|
|
|
|
DEBUG_INFO(DEBUG_CATEGORY_MEMORY, "pool_free returned: %s, free_count=%zu", location, pool->free_count); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Иначе освободить через free
|
|
|
|
|
u_free(obj); |
|
|
|
|
DEBUG_INFO(DEBUG_CATEGORY_MEMORY, "pool_free direct: %s", location); |
|
|
|
|
u_free_impl(obj, location); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Получить статистику пула
|
|
|
|
|
@ -75,6 +79,8 @@ void memory_pool_destroy(struct memory_pool* pool) {
|
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
DEBUG_INFO(DEBUG_CATEGORY_MEMORY, "pool_destroy: allocations=%zu, reuse=%zu", pool->allocations, pool->reuse_count); |
|
|
|
|
|
|
|
|
|
// Освободить все объекты в пуле
|
|
|
|
|
void* obj = pool->free_head; |
|
|
|
|
while (obj) { |
|
|
|
|
|