#pragma once /** ** \defgroup mem Memory management ** tf_malloc() and friends use malloc() behind the scenes but optionally ** track memory per system (OpenSSL, sqlite, libuv, ...) and store callstacks ** to help debug leaks. ** @{ */ #include #include #include typedef struct JSMallocFunctions JSMallocFunctions; void tf_mem_startup(bool tracking); void tf_mem_shutdown(); void tf_mem_replace_uv_allocator(); size_t tf_mem_get_uv_malloc_size(); void tf_mem_replace_tls_allocator(); size_t tf_mem_get_tls_malloc_size(); void tf_mem_replace_sqlite_allocator(); size_t tf_mem_get_sqlite_malloc_size(); size_t tf_mem_get_tf_malloc_size(); void* tf_malloc(size_t size); void* tf_realloc(void* ptr, size_t size); void tf_free(void* ptr); char* tf_strdup(const char* string); void* tf_resize_vec(void* ptr, size_t size); void tf_get_js_malloc_functions(JSMallocFunctions* out); size_t tf_mem_get_js_malloc_size(); void tf_mem_walk_allocations(void (*callback)(void* ptr, size_t size, int frames_count, void* const* frames, void* user_data), void* user_data); typedef struct _tf_mem_allocation_t { uint32_t stack_hash; int count; size_t size; void* frames[32]; int frames_count; } tf_mem_allocation_t; tf_mem_allocation_t* tf_mem_summarize_allocations(int* out_count); /** @} */