Browse Source

Memory: add location tracking to pool alloc/free with debug logging

congestion
Evgeny 6 months ago
parent
commit
2558942da1
  1. 14
      lib/memory_pool.c
  2. 14
      lib/memory_pool.h

14
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) {

14
lib/memory_pool.h

@ -3,8 +3,13 @@
#define MEMORY_POOL_H
#include <stddef.h>
#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

Loading…
Cancel
Save