diff --git a/lib/memory_pool.c b/lib/memory_pool.c index 50529cbd..dfb394bb 100644 --- a/lib/memory_pool.c +++ b/lib/memory_pool.c @@ -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) { diff --git a/lib/memory_pool.h b/lib/memory_pool.h index ba880c24..7ea287f4 100644 --- a/lib/memory_pool.h +++ b/lib/memory_pool.h @@ -3,8 +3,13 @@ #define MEMORY_POOL_H #include +#include "debug_config.h" -#define MEMORY_POOL_MAX_FREE 64 // Максимальное количество свободных объектов в пуле (чтобы не накапливать слишком много) +#define MEMORY_POOL_MAX_FREE 64 + +#define XSTR(s) STR(s) +#define STR(s) #s +#define LOCATION __FILE__ ":" XSTR(__LINE__) struct memory_pool { void* free_head; // Голова linked list свободных блоков (next хранится в начале каждого блока) @@ -20,8 +25,11 @@ struct memory_pool* memory_pool_init(size_t object_size); void memory_pool_destroy(struct memory_pool* pool); // элементы пула: -void* memory_pool_alloc(struct memory_pool* pool); -void memory_pool_free(struct memory_pool* pool, void* obj); +void* memory_pool_alloc_impl(struct memory_pool* pool, const char* location); +void memory_pool_free_impl(struct memory_pool* pool, void* obj, const char* location); void memory_pool_get_stats(struct memory_pool* pool, size_t* allocations, size_t* reuse_count); +#define memory_pool_alloc(pool) memory_pool_alloc_impl(pool, LOCATION) +#define memory_pool_free(pool, obj) memory_pool_free_impl(pool, obj, LOCATION) + #endif // MEMORY_POOL_H