16#ifndef __LAMMP_TMP_ALLOC_H__
17#define __LAMMP_TMP_ALLOC_H__
49#define HSIZE sizeof(void*)
53#if LAMMP_DEBUG_MEMORY_CHECK == 1
56 snprintf(
msg,
sizeof(
msg),
"Memory allocation failure (trying to allocate: %zu bytes)", size);
60 *(
void**)p =
pmarker->heap_marker;
87#if LAMMP_DEBUG_STACK_OVERFLOW_CHECK == 1
90 snprintf(
msg,
sizeof(
msg),
"Stack overflow (trying to allocate: %zu bytes, stack remaining: %zu bytes)",
offset,
132 lmmp_alloc_marker __lmmp_marker_ = {NULL, NULL, NULL}; \
133 int __lmmp_temp_decl_guard_ = 0
136 lmmp_alloc_marker __lmmp_marker_ = {NULL, NULL, NULL}; \
137 int __lmmp_temp_b_decl_guard_ = 0
140 lmmp_alloc_marker __lmmp_marker_ = {NULL, NULL, NULL}; \
141 int __lmmp_temp_s_decl_guard_ = 0
143#define TEMP_SALLOC_THRESHOLD 0x7f00
146#define TEMP_SALLOC(n) lmmp_temp_stack_alloc_(&__lmmp_marker_, (n))
148#define TEMP_BALLOC(n) lmmp_temp_pool_alloc_(&__lmmp_marker_, (n))
150#define TEMP_TALLOC(n) ((n) <= TEMP_SALLOC_THRESHOLD ? TEMP_SALLOC(n) : TEMP_BALLOC(n))
152#define SALLOC_TYPE(n, type) ((type*)TEMP_SALLOC((n) * sizeof(type)))
154#define BALLOC_TYPE(n, type) ((type*)TEMP_BALLOC((n) * sizeof(type)))
156#define TALLOC_TYPE(n, type) ((type*)TEMP_TALLOC((n) * sizeof(type)))
160 (void)__lmmp_temp_decl_guard_; \
161 lmmp_temp_heap_free_(&__lmmp_marker_); \
162 if (__lmmp_marker_.stack_marker != NULL) \
163 lmmp_temp_stack_free_(&__lmmp_marker_); \
164 if (__lmmp_marker_.pool_marker != NULL) \
165 lmmp_temp_pool_free_(&__lmmp_marker_); \
169 (void)__lmmp_temp_b_decl_guard_; \
170 lmmp_temp_heap_free_(&__lmmp_marker_); \
171 if (__lmmp_marker_.pool_marker != NULL) \
172 lmmp_temp_pool_free_(&__lmmp_marker_); \
176 (void)__lmmp_temp_s_decl_guard_; \
177 if (__lmmp_marker_.stack_marker != NULL) \
178 lmmp_temp_stack_free_(&__lmmp_marker_); \
182#define ALLOC_TYPE(n, type) ((type*)lmmp_alloc((size_t)(n) * sizeof(type)))
184#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)
将a向上取整到m的倍数
static void * lmmp_temp_heap_alloc_(lmmp_alloc_marker *pmarker, size_t size)
static void * lmmp_temp_stack_alloc_(lmmp_alloc_marker *pmarker, size_t size)
static void lmmp_temp_stack_free_(lmmp_alloc_marker *pmarker)
_Thread_local lmmp_memory_ctx lmmp_tmpmem_ctx
static void lmmp_temp_heap_free_(lmmp_alloc_marker *pmarker)
static void * lmmp_temp_pool_alloc_(lmmp_alloc_marker *pmarker, size_t size)
static void lmmp_temp_pool_free_(lmmp_alloc_marker *pmarker)
_Thread_local lmmp_heap_allocator_t global_heap
Copyright (C) 2026 HJimmyK(Jericho Knox)