70#define LAMMP_DEBUG_STACK_OVERFLOW_CHECK 1
72#define LAMMP_DEBUG_ASSERT_CHECK 1
74#define LAMMP_DEBUG_PARAM_ASSERT_CHECK 1
76#define LAMMP_DEBUG_MEMORY_CHECK 1
78#define LAMMP_MEMORY_MORE_ALLOC_TIMES 1
80#define LAMMP_DEBUG_MEMORY_LEAK 1
84#define LAMMP_DEBUG_STACK_OVERFLOW_CHECK 0
85#define LAMMP_DEBUG_ASSERT_CHECK 0
86#define LAMMP_DEBUG_PARAM_ASSERT_CHECK 0
87#define LAMMP_DEBUG_MEMORY_CHECK 0
88#define LAMMP_MEMORY_MORE_ALLOC_TIMES 1
89#define LAMMP_DEBUG_MEMORY_LEAK 0
93#if defined(LAMMP_WINDOWS)
95 #ifdef LAMMP_CORE_EXPORTS
96 #define LAMMP_API __declspec(dllexport)
98 #define LAMMP_API __declspec(dllimport)
102 #define LAMMP_API __attribute__((visibility("default")))
106#if defined(__x86_64__) || defined(_M_X64)
108#error "USE_ASM is only supported on x86_64 platforms"
121#define LAMMP_MAX_ALIGN 16
125#define LOG2_LIMB_BITS 6
126#define LIMB_MAX (~(mp_limb_t)0)
129#define LLIMB_MASK ((mp_limb_t)0xffffffff)
131#if defined(LAMMP_WINDOWS) && (defined(__GNUC__) || defined(__clang__))
133 #define LAMMP_THREAD_LOCAL __thread
134#elif defined(_MSC_VER)
135 #define LAMMP_THREAD_LOCAL __declspec(thread)
136#elif defined(__GNUC__)
137 #define LAMMP_THREAD_LOCAL __thread
139 #define LAMMP_THREAD_LOCAL _Thread_local
142#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L
143 #define STATIC_ASSERT _Static_assert
144#elif defined(__cplusplus) && __cplusplus >= 201103L
145 #define STATIC_ASSERT static_assert
148 #define STATIC_ASSERT(cond, msg) typedef char static_assert_##__LINE__[(cond) ? 1 : -1]
157 #if __cplusplus >= 201103L
159 #define LAMMP_NORETURN [[noreturn]]
161 #if defined(__GNUC__) || defined(__clang__)
162 #define LAMMP_NORETURN __attribute__((noreturn))
163 #elif defined(_MSC_VER)
164 #define LAMMP_NORETURN __declspec(noreturn)
166 #define LAMMP_NORETURN
171 #if defined(__STDC_VERSION__)
172 #if __STDC_VERSION__ >= 202311L
174 #define LAMMP_NORETURN [[noreturn]]
175 #elif __STDC_VERSION__ >= 201112L
177 #define LAMMP_NORETURN _Noreturn
182 #ifndef LAMMP_NORETURN
183 #if defined(__GNUC__) || defined(__clang__)
184 #define LAMMP_NORETURN __attribute__((noreturn))
185 #elif defined(_MSC_VER)
186 #define LAMMP_NORETURN __declspec(noreturn)
188 #define LAMMP_NORETURN
193#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202311L
195 #define LAMMP_ASSUME(expr) do { [[assume(expr)]]; } while(0)
196#elif defined(__clang__)
198 #define LAMMP_ASSUME(expr) __builtin_assume(expr)
199#elif defined(_MSC_VER)
201 #define LAMMP_ASSUME(expr) __assume(expr)
202#elif defined(__GNUC__)
206 #define LAMMP_ASSUME(expr) do { __attribute__((assume(expr))); } while(0)
209 #define LAMMP_ASSUME(expr) do { if (!(expr)) __builtin_unreachable(); } while(0)
213 #define LAMMP_ASSUME(expr) ((void)(expr))
231typedef void* (*lmmp_heap_alloc_fn)(
size_t size);
233typedef void* (*lmmp_realloc_fn )(
void* ptr,
size_t size);
350#if LAMMP_DEBUG_MEMORY_CHECK == 1
359#define lmmp_alloc(size) lmmp_alloc(size, __func__, __LINE__)
371#if LAMMP_DEBUG_MEMORY_CHECK == 1
373#define lmmp_realloc(ptr, size) lmmp_realloc(ptr, size, __func__, __LINE__)
387#if LAMMP_DEBUG_MEMORY_CHECK == 1
394#define lmmp_free(ptr) lmmp_free(ptr, __func__, __LINE__)
421#if LAMMP_DEBUG_MEMORY_LEAK == 1
425#define lmmp_leak_tracker lmmp_leak_tracker(__func__, __LINE__)
427#define lmmp_leak_tracker ((void)0)
433#define LMMP_ABS(x) ((x) >= 0 ? (x) : -(x))
437#define LMMP_MIN(l, o) ((l) < (o) ? (l) : (o))
441#define LMMP_MAX(h, i) ((h) > (i) ? (h) : (i))
445#define LMMP_SWAP(x, y, type) \
454#define LMMP_POW2_Q(n) (((n) & ((n) - 1)) == 0)
458#define LMMP_ROUND_UP_MULTIPLE(a, m) ((a) + (m) - 1 - ((a) + (m) - 1) % (m))
461#define lmmp_copy(dst, src, n) memmove((dst), (src), ((size_t)(n) << 3))
463#define lmmp_zero(dst, n) memset((dst), 0, ((size_t)(n) << 3))
468#define lmmp_assert(x) \
471 lmmp_abort(LAMMP_ERROR_ASSERT_FAILURE, #x, __func__, __LINE__); \
475#if LAMMP_DEBUG_ASSERT_CHECK == 1
477#define lmmp_debug_assert(x) \
480 lmmp_abort(LAMMP_ERROR_DEBUG_ASSERT_FAILURE, #x, __func__, __LINE__); \
485#define lmmp_debug_assert(x) LAMMP_ASSUME(x)
488#if LAMMP_DEBUG_PARAM_ASSERT_CHECK == 1
489#define lmmp_param_assert(x) \
492 lmmp_abort(LAMMP_ERROR_PARAM_ASSERT_FAILURE, #x, __func__, __LINE__); \
496#define lmmp_param_assert(x) LAMMP_ASSUME(x)
void * lmmp_realloc(void *ptr, size_t size)
内存重分配函数(调用lmmp_realloc_fn)
void lmmp_set_heap_allocator(const lmmp_heap_allocator_t *heap)
设置 LAMMP 全局堆内存分配函数
void(* lmmp_heap_free_fn)(void *ptr)
void * lmmp_alloc(size_t size)
内存分配函数(调用lmmp_heap_alloc_fn)
const mp_limb_t * mp_srcptr
void *(* lmmp_realloc_fn)(void *ptr, size_t size)
lmmp_abort_fn lmmp_set_abort_fn(lmmp_abort_fn func)
设置 LAMMP 全局退出函数(所有线程均生效)
void lmmp_abort(lmmp_error_t type, const char *msg, const char *func, int line)
LAMMP 全局退出函数,内部错误或断言失败时调用,若设置了全局退出函数,则会调用该函数,否则会调用默认的退出函数。
int lmmp_stack_deinit(void)
LAMMP 全局栈释放函数(通常不需要手动调用)
#define STATIC_ASSERT(cond, msg)
int lmmp_stack_init(size_t size)
LAMMP 全局栈初始化函数(通常不需要手动调用)
void lmmp_free(void *ptr)
内存释放函数(调用lmmp_heap_free_fn)
void lmmp_fill(mp_ptr dst, mp_size_t begin, mp_size_t end, mp_limb_t val)
Copyright (C) 2026 HJimmyK(Jericho Knox)
void lmmp_global_init(void)
全局初始化函数(线程局部的)
void *(* lmmp_heap_alloc_fn)(size_t size)
void lmmp_global_deinit(void)
(线程局部的)全局共享的动态分配的堆内存资源释放函数
void(* lmmp_abort_fn)(lmmp_error_t type, const char *msg, const char *func, int line)
LAMMP 全局退出函数指针类型
@ LAMMP_ERROR_MEMORY_ALLOC_FAILURE
@ LAMMP_ERROR_DEBUG_ASSERT_FAILURE
@ LAMMP_ERROR_UNEXPECTED_ERROR
@ LAMMP_ERROR_MEMORY_LEAK
@ LAMMP_ERROR_ASSERT_FAILURE
@ LAMMP_ERROR_PARAM_ASSERT_FAILURE
@ LAMMP_ERROR_MEMORY_FREE_FAILURE
@ LAMMP_ERROR_OUT_OF_BOUNDS
#define lmmp_leak_tracker
int lmmp_alloc_count(int cnt)
堆内存分配计数器(线程局部)