36#define LAMMP_DEBUG_STACK_OVERFLOW_CHECK 1
38#define LAMMP_DEBUG_ASSERT_CHECK 1
40#define LAMMP_DEBUG_PARAM_ASSERT_CHECK 1
42#define LAMMP_DEBUG_MEMORY_CHECK 1
44#define LAMMP_MEMORY_MORE_ALLOC_TIMES 1
46#define LAMMP_DEBUG_MEMORY_LEAK 1
50#define LAMMP_DEBUG_STACK_OVERFLOW_CHECK 0
51#define LAMMP_DEBUG_ASSERT_CHECK 0
52#define LAMMP_DEBUG_PARAM_ASSERT_CHECK 0
53#define LAMMP_DEBUG_MEMORY_CHECK 0
54#define LAMMP_MEMORY_MORE_ALLOC_TIMES 1
55#define LAMMP_DEBUG_MEMORY_LEAK 0
59#if defined(LAMMP_WINDOWS)
61 #ifdef LAMMP_CORE_EXPORTS
62 #define LAMMP_API __declspec(dllexport)
64 #define LAMMP_API __declspec(dllimport)
68 #define LAMMP_API __attribute__((visibility("default")))
72#if defined(__x86_64__) || defined(_M_X64)
74#error "USE_ASM is only supported on x86_64 platforms"
87typedef void* (*lmmp_heap_alloc_fn)(
size_t size);
89typedef void* (*lmmp_realloc_fn )(
void* ptr,
size_t size);
219#define LAMMP_MAX_ALIGN 16
223#define LOG2_LIMB_BITS 6
224#define LIMB_MAX (~(mp_limb_t)0)
227#define LLIMB_MASK ((mp_limb_t)0xffffffff)
229#if defined(LAMMP_WINDOWS) && (defined(__GNUC__) || defined(__clang__))
231 #define LAMMP_THREAD_LOCAL __thread
232#elif defined(_MSC_VER)
233 #define LAMMP_THREAD_LOCAL __declspec(thread)
234#elif defined(__GNUC__)
235 #define LAMMP_THREAD_LOCAL __thread
237 #define LAMMP_THREAD_LOCAL _Thread_local
240#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L
241#define STATIC_ASSERT _Static_assert
242#elif defined(__cplusplus) && __cplusplus >= 201103L
243#define STATIC_ASSERT static_assert
246#define STATIC_ASSERT(cond, msg) typedef char static_assert_##__LINE__[(cond) ? 1 : -1]
255#if LAMMP_DEBUG_MEMORY_CHECK == 1
257#define lmmp_alloc(size) lmmp_alloc(size, __func__, __LINE__)
268#if LAMMP_DEBUG_MEMORY_CHECK == 1
270#define lmmp_realloc(ptr, size) lmmp_realloc(ptr, size, __func__, __LINE__)
282#if LAMMP_DEBUG_MEMORY_CHECK == 1
284#define lmmp_free(ptr) lmmp_free(ptr, __func__, __LINE__)
310#if LAMMP_DEBUG_MEMORY_LEAK == 1
314#define lmmp_leak_tracker lmmp_leak_tracker(__func__, __LINE__)
316#define lmmp_leak_tracker ((void)0)
319#if LAMMP_DEBUG_MEMORY_CHECK == 1
321#define lmmp_stack_alloc(size) lmmp_stack_alloc(size, __func__, __LINE__)
333#if LAMMP_DEBUG_MEMORY_CHECK == 1
335#define lmmp_stack_free(ptr) lmmp_stack_free(ptr, __func__, __LINE__)
346#define LMMP_ABS(x) ((x) >= 0 ? (x) : -(x))
348#define LMMP_MIN(l, o) ((l) < (o) ? (l) : (o))
350#define LMMP_MAX(h, i) ((h) > (i) ? (h) : (i))
352#define LMMP_SWAP(x, y, type) \
359#define LMMP_POW2_Q(n) (((n) & ((n) - 1)) == 0)
361#define LMMP_ROUND_UP_MULTIPLE(a, m) ((a) + (m) - 1 - ((a) + (m) - 1) % (m))
364#define lmmp_copy(dst, src, n) memmove(dst, src, (n) << 3)
366#define lmmp_zero(dst, n) memset(dst, 0, (n) << 3)
370#define lmmp_assert(x) \
373 lmmp_abort(LAMMP_ERROR_ASSERT_FAILURE, #x, __func__, __LINE__); \
377#if LAMMP_DEBUG_ASSERT_CHECK == 1
379#define lmmp_debug_assert(x) \
382 lmmp_abort(LAMMP_ERROR_DEBUG_ASSERT_FAILURE, #x, __func__, __LINE__); \
387#define lmmp_debug_assert(x) ((void)0)
390#if LAMMP_DEBUG_PARAM_ASSERT_CHECK == 1
391#define lmmp_param_assert(x) \
394 lmmp_abort(LAMMP_ERROR_PARAM_ASSERT_FAILURE, #x, __func__, __LINE__); \
398#define lmmp_param_assert(x) ((void)0)
void * lmmp_stack_alloc(size_t size)
栈内存分配函数(使用stack_get_top和stack_set_top)
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)
void lmmp_stack_free(void *ptr)
栈内存释放函数(使用stack_get_top和stack_set_top)
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 全局退出函数,内部错误或断言失败时调用,若设置了全局退出函数,则会调用该函数,否则会调用默认的退出函数。
#define STATIC_ASSERT(cond, msg)
void lmmp_stack_reset(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
void lmmp_stack_init(void)
LAMMP 全局栈初始化函数(通常不需要手动调用)
#define lmmp_leak_tracker
int lmmp_alloc_count(int cnt)
堆内存分配计数器(线程局部)