16#include "../../../include/lammp/impl/mparam.h"
17#include "../../../include/lammp/impl/prime_table.h"
18#include "../../../include/lammp/impl/tmp_alloc.h"
19#include "../../../include/lammp/lmmpn.h"
24#undef lmmp_stack_alloc
26#undef lmmp_leak_tracker
27#define HSIZE sizeof(void*)
35#define heap_alloc_func global_heap.alloc
36#define heap_free_func global_heap.free
37#define realloc_func global_heap.realloc
98#if LAMMP_DEBUG_MEMORY_LEAK == 1
105#if LAMMP_DEBUG_MEMORY_CHECK == 1
116#define MEM_MAGIC 0xDEADBEEFDEADBEEFULL
117#define MEM_GUARD 0xDEADBEEFUL
118#define EXTRA_MEM_PATTERN 0xAA
120#define ALIGNMENT LAMMP_MAX_ALIGN
122static inline size_t align_up(
size_t size) {
141 for (
size_t i = 0;
i <
len;
i++) {
169#define SAFE_APPEND(...) \
171 if (offset < buf_size) { \
172 int n = snprintf(error_buf + offset, (size_t)(buf_size - offset), __VA_ARGS__); \
178 SAFE_APPEND(
"Memory overflow (extra memory corruption) detected!%s",
"\n");
183 SAFE_APPEND(
" extra size: %zu bytes (%.0f%% of user size)\n",
hdr->extra_size,
188 SAFE_APPEND(
"Likely cause: Buffer overflow beyond the end of the memory.%s",
"\n");
207 "Memory header corruption detected!\n"
208 " Magic: 0x%016llx (expected 0x%016llx)\n"
209 " Guard: 0x%08lx (expected 0x%08lx)\n"
210 "Possible overflow or underflow or invalid pointer.",
252 hdr->user_size = size;
318#undef EXTRA_MEM_PATTERN
344 "Default stack allocator is not empty. top: %p, begin: %p, end: %p;\n",
350 "Default pool allocator is not empty. top: %p, begin: %p; remain: %zu bytes, capacity: %zu "
361#if LAMMP_DEBUG_MEMORY_CHECK == 1
364#if LAMMP_DEBUG_MEMORY_LEAK == 1
372 snprintf(
msg,
sizeof(
msg),
"Memory allocation failed (size: %zu bytes)", size);
377#if LAMMP_DEBUG_PARAM_ASSERT_CHECK == 1
386#if LAMMP_DEBUG_MEMORY_LEAK == 1
393#if LAMMP_DEBUG_MEMORY_CHECK == 1
400#if LAMMP_DEBUG_PARAM_ASSERT_CHECK == 1
414#if LAMMP_DEBUG_MEMORY_CHECK == 1
417#if LAMMP_DEBUG_MEMORY_LEAK == 1
425#if LAMMP_DEBUG_MEMORY_LEAK == 1
void(* lmmp_heap_free_fn)(void *ptr)
void *(* lmmp_realloc_fn)(void *ptr, size_t size)
void lmmp_abort(lmmp_error_t type, const char *msg, const char *func, int line)
LAMMP 全局退出函数,内部错误或断言失败时调用,若设置了全局退出函数,则会调用该函数,否则会调用默认的退出函数。
#define LAMMP_THREAD_LOCAL
#define LAMMP_MEMORY_MORE_ALLOC_TIMES
void *(* lmmp_heap_alloc_fn)(size_t size)
@ LAMMP_ERROR_MEMORY_ALLOC_FAILURE
@ LAMMP_ERROR_MEMORY_LEAK
@ LAMMP_ERROR_MEMORY_FREE_FAILURE
@ LAMMP_ERROR_OUT_OF_BOUNDS
#define lmmp_leak_tracker
void lmmp_set_heap_allocator(const lmmp_heap_allocator_t *heap)
设置 LAMMP 全局堆内存分配函数
_Thread_local lmmp_memory_ctx lmmp_tmpmem_ctx
void * lmmp_alloc(size_t size)
内存分配函数(调用lmmp_heap_alloc_fn)
int lmmp_stack_deinit(void)
LAMMP 全局栈释放函数(通常不需要手动调用)
int lmmp_stack_init(size_t size)
LAMMP 全局栈初始化函数(通常不需要手动调用)
void lmmp_free(void *ptr)
内存释放函数(调用lmmp_heap_free_fn)
void * lmmp_realloc(void *oldptr, size_t new_size)
内存重分配函数(调用lmmp_realloc_fn)
static _Thread_local int heap_alloc_count
void lmmp_global_init(void)
全局初始化函数(线程局部的)
static void lmmp_memory_abort(size_t size, const char *func, int line)
void lmmp_global_deinit(void)
(线程局部的)全局共享的动态分配的堆内存资源释放函数
_Thread_local lmmp_heap_allocator_t global_heap
int lmmp_alloc_count(int cnt)
堆内存分配计数器(线程局部)
#define LAMMP_DEFAULT_STACK_SIZE
Copyright (C) 2026 HJimmyK(Jericho Knox)
void lmmp_prime_int_table_free_(void)
释放全局素数表
Copyright (C) 2026 HJimmyK(Jericho Knox)