33#define LAMMP_DEBUG_STACK_OVERFLOW_CHECK 1
35#define LAMMP_DEBUG_ASSERT_CHECK 1
37#define LAMMP_DEBUG_PARAM_ASSERT_CHECK 1
39#define LAMMP_DEBUG_MEMORY_CHECK 1
41#define LAMMP_MEMORY_MORE_ALLOC_TIMES 1
43#define LAMMP_DEBUG_MEMORY_LEAK 1
47#define LAMMP_DEBUG_STACK_OVERFLOW_CHECK 0
48#define LAMMP_DEBUG_ASSERT_CHECK 0
49#define LAMMP_DEBUG_PARAM_ASSERT_CHECK 0
50#define LAMMP_DEBUG_MEMORY_CHECK 0
51#define LAMMP_MEMORY_MORE_ALLOC_TIMES 1
52#define LAMMP_DEBUG_MEMORY_LEAK 0
56#if defined(LAMMP_WINDOWS)
58 #ifdef LAMMP_CORE_EXPORTS
59 #define LAMMP_API __declspec(dllexport)
61 #define LAMMP_API __declspec(dllimport)
65 #define LAMMP_API __attribute__((visibility("default")))
69#if defined(__x86_64__) || defined(_M_X64)
71#error "USE_ASM is only supported on x86_64 platforms"
84#define LAMMP_MAX_ALIGN 16
88#define LOG2_LIMB_BITS 6
89#define LIMB_MAX (~(mp_limb_t)0)
92#define LLIMB_MASK ((mp_limb_t)0xffffffff)
94#if defined(LAMMP_WINDOWS) && (defined(__GNUC__) || defined(__clang__))
96 #define LAMMP_THREAD_LOCAL __thread
97#elif defined(_MSC_VER)
98 #define LAMMP_THREAD_LOCAL __declspec(thread)
99#elif defined(__GNUC__)
100 #define LAMMP_THREAD_LOCAL __thread
102 #define LAMMP_THREAD_LOCAL _Thread_local
105#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L
106 #define STATIC_ASSERT _Static_assert
107#elif defined(__cplusplus) && __cplusplus >= 201103L
108 #define STATIC_ASSERT static_assert
111 #define STATIC_ASSERT(cond, msg) typedef char static_assert_##__LINE__[(cond) ? 1 : -1]
120 #if __cplusplus >= 201103L
122 #define LAMMP_NORETURN [[noreturn]]
124 #if defined(__GNUC__) || defined(__clang__)
125 #define LAMMP_NORETURN __attribute__((noreturn))
126 #elif defined(_MSC_VER)
127 #define LAMMP_NORETURN __declspec(noreturn)
129 #define LAMMP_NORETURN
134 #if defined(__STDC_VERSION__)
135 #if __STDC_VERSION__ >= 202311L
137 #define LAMMP_NORETURN [[noreturn]]
138 #elif __STDC_VERSION__ >= 201112L
140 #define LAMMP_NORETURN _Noreturn
145 #ifndef LAMMP_NORETURN
146 #if defined(__GNUC__) || defined(__clang__)
147 #define LAMMP_NORETURN __attribute__((noreturn))
148 #elif defined(_MSC_VER)
149 #define LAMMP_NORETURN __declspec(noreturn)
151 #define LAMMP_NORETURN
165typedef void* (*lmmp_heap_alloc_fn)(
size_t size);
167typedef void* (*lmmp_realloc_fn )(
void* ptr,
size_t size);
284#if LAMMP_DEBUG_MEMORY_CHECK == 1
286#define lmmp_alloc(size) lmmp_alloc(size, __func__, __LINE__)
297#if LAMMP_DEBUG_MEMORY_CHECK == 1
299#define lmmp_realloc(ptr, size) lmmp_realloc(ptr, size, __func__, __LINE__)
311#if LAMMP_DEBUG_MEMORY_CHECK == 1
313#define lmmp_free(ptr) lmmp_free(ptr, __func__, __LINE__)
339#if LAMMP_DEBUG_MEMORY_LEAK == 1
343#define lmmp_leak_tracker lmmp_leak_tracker(__func__, __LINE__)
345#define lmmp_leak_tracker ((void)0)
349#define LMMP_ABS(x) ((x) >= 0 ? (x) : -(x))
351#define LMMP_MIN(l, o) ((l) < (o) ? (l) : (o))
353#define LMMP_MAX(h, i) ((h) > (i) ? (h) : (i))
355#define LMMP_SWAP(x, y, type) \
362#define LMMP_POW2_Q(n) (((n) & ((n) - 1)) == 0)
364#define LMMP_ROUND_UP_MULTIPLE(a, m) ((a) + (m) - 1 - ((a) + (m) - 1) % (m))
367#define lmmp_copy(dst, src, n) memmove((dst), (src), ((size_t)(n) << 3))
369#define lmmp_zero(dst, n) memset((dst), 0, ((size_t)(n) << 3))
373#define lmmp_assert(x) \
376 lmmp_abort(LAMMP_ERROR_ASSERT_FAILURE, #x, __func__, __LINE__); \
380#if LAMMP_DEBUG_ASSERT_CHECK == 1
382#define lmmp_debug_assert(x) \
385 lmmp_abort(LAMMP_ERROR_DEBUG_ASSERT_FAILURE, #x, __func__, __LINE__); \
390#define lmmp_debug_assert(x) ((void)0)
393#if LAMMP_DEBUG_PARAM_ASSERT_CHECK == 1
394#define lmmp_param_assert(x) \
397 lmmp_abort(LAMMP_ERROR_PARAM_ASSERT_FAILURE, #x, __func__, __LINE__); \
401#define lmmp_param_assert(x) ((void)0)
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_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)
堆内存分配计数器(线程局部)