19#ifndef __LAMMP_TMP_ALLOC_H__
20#define __LAMMP_TMP_ALLOC_H__
52 void* new_top = (
void*)((
mp_byte_t*)p + offset);
53#if LAMMP_DEBUG_STACK_OVERFLOW_CHECK == 1
56 snprintf(msg,
sizeof(msg),
"Stack overflow (trying to allocate: %zu bytes, stack remaining: %zu bytes)", offset,
73 void *lmmp_temp_alloc_marker_ = NULL, *lmmp_temp_stack_marker_ = NULL
75#define TEMP_B_DECL void* lmmp_temp_alloc_marker_ = NULL
76#define TEMP_S_DECL void* lmmp_temp_stack_marker_ = NULL
78#define TEMP_SALLOC_THRESHOLD 0x7f00
81#define TEMP_SALLOC(n) lmmp_temp_stack_alloc_(&lmmp_temp_stack_marker_, (n))
83#define TEMP_BALLOC(n) lmmp_temp_heap_alloc_(&lmmp_temp_alloc_marker_, (n))
85#define TEMP_TALLOC(n) ((n) <= TEMP_SALLOC_THRESHOLD ? TEMP_SALLOC(n) : TEMP_BALLOC(n))
87#define SALLOC_TYPE(n, type) ((type*)TEMP_SALLOC((n) * sizeof(type)))
89#define BALLOC_TYPE(n, type) ((type*)TEMP_BALLOC((n) * sizeof(type)))
91#define TALLOC_TYPE(n, type) ((type*)TEMP_TALLOC((n) * sizeof(type)))
95 if (lmmp_temp_alloc_marker_) \
96 lmmp_temp_heap_free_(lmmp_temp_alloc_marker_); \
97 if (lmmp_temp_stack_marker_) \
98 lmmp_temp_stack_free_(lmmp_temp_stack_marker_); \
102 if (lmmp_temp_alloc_marker_) \
103 lmmp_temp_heap_free_(lmmp_temp_alloc_marker_); \
107 if (lmmp_temp_stack_marker_) \
108 lmmp_temp_stack_free_(lmmp_temp_stack_marker_); \
112#define ALLOC_TYPE(n, type) ((type*)lmmp_alloc((size_t)(n) * sizeof(type)))
114#define REALLOC_TYPE(p, new_size, type) ((type*)lmmp_realloc((p), (new_size) * sizeof(type)))
void lmmp_abort(lmmp_error_t type, const char *msg, const char *func, int line)
LAMMP 全局退出函数,内部错误或断言失败时调用,若设置了全局退出函数,则会调用该函数,否则会调用默认的退出函数。
#define LAMMP_THREAD_LOCAL
@ LAMMP_ERROR_MEMORY_ALLOC_FAILURE
#define LMMP_ROUND_UP_MULTIPLE(a, m)
void lmmp_temp_heap_free_(void *marker)
临时堆内存释放函数
void * lmmp_temp_heap_alloc_(void **pmarker, size_t size)
临时堆内存分配函数
_Thread_local void * lmmp_stack_begin
_Thread_local void * lmmp_stack_top
_Thread_local void * lmmp_stack_end
static void * lmmp_temp_stack_alloc_(void **pmarker, size_t size)
static void lmmp_temp_stack_free_(void *marker)