LAMMP 4.1.0
Lamina High-Precision Arithmetic Library
载入中...
搜索中...
未找到
lmmp.h
浏览该文件的文档.
1/*
2 * [LAMMP]
3 * Copyright (C) [2025-2026] [HJimmyK(Jericho Knox)]
4 *
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU Lesser General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public License
16 * along with this program. If not, see <https://www.gnu.org/licenses/>.
17 */
18
19#ifndef LAMMP_LMMP_H
20#define LAMMP_LMMP_H
21
22#include <stddef.h>
23#include <stdint.h>
24#include <stdlib.h>
25#include <string.h>
26
27#ifdef __cplusplus
28extern "C" {
29#endif
30
31#if defined(DEBUG)
32
33/* LAMMP 调试宏,定义为1时,会开启相应的调试功能,共有四个开销等级:低、中、高、很高。 */
34
35// 开启时,将会检查栈溢出;开销:中
36#define LAMMP_DEBUG_STACK_OVERFLOW_CHECK 1
37// 开启时,将会开启debug_assert的检查;开销:低
38#define LAMMP_DEBUG_ASSERT_CHECK 1
39// 开启时,将会进行参数检查;开销:中
40#define LAMMP_DEBUG_PARAM_ASSERT_CHECK 1
41// 开启时,将会进行全面的堆栈内存检查,包括堆栈溢出、指针释放检查、缓冲区溢出检查;开销:很高
42#define LAMMP_DEBUG_MEMORY_CHECK 1
43// 堆栈溢出检查中额外分配的内存倍数,额外分配的内存空间=单次分配的内存空间*(MORE_ALLOC_TIMES/10)
44#define LAMMP_MEMORY_MORE_ALLOC_TIMES 1
45// 开启时,会增加内存分配和释放次数的统计功能;开销:中
46#define LAMMP_DEBUG_MEMORY_LEAK 1
47
48#else
49
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
56
57#endif
58
59#if defined(LAMMP_WINDOWS)
60 // Windows: MSVC / MinGW / Clang
61 #ifdef LAMMP_CORE_EXPORTS
62 #define LAMMP_API __declspec(dllexport)
63 #else
64 #define LAMMP_API __declspec(dllimport)
65 #endif
66#else
67 // Linux/macOS: GCC / Clang
68 #define LAMMP_API __attribute__((visibility("default")))
69#endif
70
71#if defined(USE_ASM)
72#if defined(__x86_64__) || defined(_M_X64)
73#else
74#error "USE_ASM is only supported on x86_64 platforms"
75#endif
76#endif
77
78/*
79 LAMMP 内存分配函数指针类型:
80 1. heap_alloc : 堆内存分配器
81 2. heap_free : 堆内存释放器
82 3. realloc : 堆内存重新分配器
83
84 默认使用 malloc、free、realloc 实现。
85 */
86
87typedef void* (*lmmp_heap_alloc_fn)(size_t size);
88typedef void (*lmmp_heap_free_fn )(void* ptr);
89typedef void* (*lmmp_realloc_fn )(void* ptr, size_t size);
90
96
97/**
98 * @brief 设置 LAMMP 全局堆内存分配函数
99 * @param heap 新的堆内存分配器,可以为NULL,表示使用默认的 malloc, free, realloc
100 * @warning 由于所有共享内存都采用堆内存分配。因此,传入新的堆分配器将会首先调用
101 * lmmp_global_deinit 函数,释放所有共享内存,以保证老旧的堆资源被释放。
102 * 然后将会自动调用 lmmp_global_init 函数,重新分配所有线程局部内存。
103 * 同时,为保证内存不泄露,在开启 LAMMP_DEBUG_MEMORY_LEAK 宏时,将会对堆
104 * 栈分配器进行检查。若此时堆栈分配计数器不为 0,则会触发lmmp_abort函数,
105 * 并输出相应的错误信息。
106 * @note 堆分配器是线程局部的,因此,创建新线程时,如有需要,请自行设置新的堆分配器。
107 * 同时也请自行保证分配器和释放器相匹配。
108 */
110
111/**
112 * @brief LAMMP 全局栈重置函数(通常不需要手动调用)
113 * @param size 新的默认栈大小,单位为字节(不建议设置少于 256KB 的栈,少于此值可能导致栈溢出)
114 * @warning 请注意调用此函数后,访问之前的分配的栈空间将会导致未定义行为。在定义了
115 * LAMMP_DEBUG_MEMORY_LEAK 宏时,释放默认栈时,会检查默认栈是否为空,
116 * 若默认栈不为空,则会触发lmmp_abort函数。栈为空时,或者无法确定栈是否初始化,
117 * 均可以调用此函数,如果设置的大小比此前的大小小,则会直接重置栈顶,否则,会重新分
118 * 配一块新的栈内存。同时,为保证内存不泄露,请自行确保调用此函数时,栈为空。
119 * 在开启 LAMMP_DEBUG_MEMORY_LEAK 宏时,将会对栈进行检查。若此时栈不为空,
120 * 则会触发lmmp_abort函数。
121 * @note 当 size 为 0 时,将会释放栈,如果此后再使用栈内存。
122 */
123LAMMP_API void lmmp_stack_reset(size_t size);
124
125/**
126 * @brief LAMMP 全局栈初始化函数(通常不需要手动调用)
127 * @note 按照默认的栈大小(320kb),对栈进行初始化,可多次重入。
128 * lmmp_global_init 函数会自动调用此函数,无需手动调用。
129 */
130LAMMP_API void lmmp_stack_init(void);
131
142
143/**
144 * @brief LAMMP 全局退出函数指针类型
145 * @param type 退出类型(可以查看lmmp_abort函数对此参数的说明,这里不再重复)
146 * @param msg 退出信息,取决于type
147 * @param func 退出处的函数名
148 * @param line 退出处的行号
149 */
150typedef void (*lmmp_abort_fn)(lmmp_error_t type, const char* msg, const char* func, int line);
151
152/**
153 * @brief 设置 LAMMP 全局退出函数(所有线程均生效)
154 * @param func 退出函数指针,可以为NULL
155 * @warning 请注意,我们将不会对 func 的调用做任何保护,因此请不要在 func 里做任何危险的操作,
156 * 本库的开发者不对 func 函数的调用产生的影响做任何保证。
157 * @note 若 func 为 NULL,则代表使用默认的退出机制。同时,此函数指针是全局的,所有线程共享。
158 * @return 返回之前的退出函数指针,若原指针为NULL,则返回NULL。
159 */
161
162/**
163 * @brief LAMMP 全局退出函数,内部错误或断言失败时调用,若设置了全局退出函数,则会调用该函数,否则会调用默认的退出函数。
164 * @param msg 退出信息,assert类型的错误信息通常仅包含断言内容,其他类型的错误则因类型不同而不同。
165 * @param func 退出处的函数名
166 * @param line 退出处的行号
167 * @param type 退出类型。有以下几个类型:
168 *
169 * 1. ASSERT_FAILURE (枚举值为1)为lmmp_assert触发的退出,lmmp_assert触发的普通退出几乎不可能发生,
170 * 其通常代表不可能发生的计算错误,可能表明程序执行此处时必须正确的输入错误。比如预期无进位的加法产生了进位。
171 * 此类错误不可接受,会导致计算无法继续进行,导致程序崩溃。
172 *
173 * 2. DEBUG_ASSERT_FAILURE (枚举值为2)为lmmp_debug_assert触发的退出,其通常表明预期之外的错误,
174 * 这通常是调用者的UB,如无UB的情况下触发此错误;也可能是LAMMP内部的逻辑错误,开发者期待的输入错误,
175 * 在该逻辑处仅简单考虑了某些情况。如有此类错误,可以报告给开发者。此类型只会在定义了
176 * LAMMP_DEBUG_ASSERT_CHECK 宏为 1 的情况下才会触发。
177 *
178 * 3. PARAM_ASSERT_FAILURE (枚举值为3)为参数检查失败导致的退出,其通常表明调用者传入了无效的参数,
179 * 导致函数的行为不符合预期。此类错误不可接受,会导致计算无法继续进行,导致程序崩溃。此类型的错误只有在
180 * 定义了 LAMMP_DEBUG_PARAM_ASSERT_CHECK 宏为 1 的情况下才会触发。
181 *
182 * 4. MEMORY_ALLOC_FAILURE (枚举值为4)为内存分配失败退出,这可能有两种情况:一种情况为分配了堆内存不足,
183 * 导致程序崩溃;另一种情况为栈分配器的栈溢出(栈空间不足或其他UB),其中,情况一是会永远进行的,而情况二
184 * 只有在定义了 LAMMP_DEBUG_STACK_OVERFLOW_CHECK 宏为 1 的情况下才会触发。
185 *
186 * 5. MEMORY_FREE_FAILURE (枚举值为5)为内存释放错误,此错误有两种触发可能,一种为堆内存分配释放时,头部信息被损坏
187 * 可能源于传入错误的指针,或缓冲区溢出导致此头部损坏。另一种情况为类似的,由栈分配器分配的内存释放时,头部信息损坏
188 * 或指针不在栈的范围内,导致释放错误,如不是传入错误指针,则可能为栈分配的前一次内存缓冲区溢出,导致此内存释放时,
189 * 头部信息损坏,导致释放无法进行。此类错误错误触发情况较为复杂,LAMMP_DEBUG_MEMORY_CHECK 宏为 1 时,两种情况都
190 * 有可能发生,仅定义 LAMMP_DEBUG_STACK_OVERFLOW_CHECK 宏为 1 时,此错误仅可能由栈分配器触发。
191 *
192 * 6. OUT_OF_BOUNDS (枚举值为6)为数组越界访问导致的退出,通常表明未按规定使用空间。此类型的错误在堆栈分配器中,
193 * 均可能触发,但由于栈分配器的特殊性,可能部分越界访问可能被判定为栈溢出,或内存释放错误。具体可尝试查看错误信息。
194 * 此类型只会在定义了 LAMMP_DEBUG_MEMORY_CHECK 宏为 1 的情况下才会触发,Release 模式下通常为 0 。
195 *
196 * 7. MEMORY_LEAK (枚举值为7)为内存泄漏导致的退出,有两种情况,一种情况为堆内存计数器不为0,另一种情况为当前栈帧
197 * 不在栈底。此类型的错误需定义 LAMMP_DEBUG_MEMORY_MEMORY_LEAK 宏为 1,才会触发。通常情况下,此错误需要手动调用
198 * lmmp_leak_tracker宏进行检查。但在调用堆分配器重置时,将会显式检查此时的堆计数器是否为0;在进行栈重置时,会显式检
199 * 查栈是否为空,若不满足,触发此错误。特别注意,当手动调用检查宏时,在某些情况下,可能会进行一些全局堆资源的初始化,
200 * 但未释放,如想正确计数,请先调用 lmmp_global_deinit 进行全局共享的堆资源的安全释放。
201 *
202 * 8. UNEXPECTED_ERROR (枚举值为8)为其他未知错误导致的退出。
203 *
204 * @warning LAMMP内部中断都将会调用此函数,如果全局退出函数为NULL,则使用默认的退出函数,会打印出全部错误信息,并调用
205 * abort 函数中断程序。自定义全局退出函数请通过 lmmp_set_abort_fn 函数进行设置。请不要在全局退出函数里做任
206 * 何危险的操作,本库的开发者不对其调用产生的影响做任何保证。
207 */
208LAMMP_API void lmmp_abort(lmmp_error_t type, const char *msg, const char *func, int line);
209
210typedef uint8_t mp_byte_t; // 字节类型 (8位无符号整数)
211typedef uint64_t mp_limb_t; // 基本运算单元(limb)类型 (64位无符号整数)
212typedef uint64_t mp_size_t; // 表示limb数量的无符号整数类型
213typedef int64_t mp_slimb_t; // 有符号limb类型 (64位有符号整数)
214typedef int64_t mp_ssize_t; // 表示limb数量的有符号整数类型
215typedef mp_limb_t* mp_ptr; // 指向limb类型的指针
216typedef const mp_limb_t* mp_srcptr; // 指向const limb类型的指针(源操作数指针)
217typedef size_t mp_bitcnt_t; // 表示bit数量的无符号整数类型
218
219#define LAMMP_MAX_ALIGN 16 // 最大对齐单位
220
221#define LIMB_BITS 64
222#define LIMB_BYTES 8
223#define LOG2_LIMB_BITS 6
224#define LIMB_MAX (~(mp_limb_t)0)
225#define LLIMB_BITS 32
226#define LLIMB_BYTES 4
227#define LLIMB_MASK ((mp_limb_t)0xffffffff)
228
229#if defined(LAMMP_WINDOWS) && (defined(__GNUC__) || defined(__clang__))
230 // MinGW on Windows: use native TLS section
231 #define LAMMP_THREAD_LOCAL __thread
232#elif defined(_MSC_VER)
233 #define LAMMP_THREAD_LOCAL __declspec(thread)
234#elif defined(__GNUC__) // Linux/macOS
235 #define LAMMP_THREAD_LOCAL __thread
236#else
237 #define LAMMP_THREAD_LOCAL _Thread_local
238#endif
239
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
244#else
245// C99/C89 fallback (no message)
246#define STATIC_ASSERT(cond, msg) typedef char static_assert_##__LINE__[(cond) ? 1 : -1]
247#endif
248
249STATIC_ASSERT(sizeof(void*) == 8, "64-bit architecture required");
250
251#undef STATIC_ASSERT
252
253// ============================内存管理相关函数=============================
254
255#if LAMMP_DEBUG_MEMORY_CHECK == 1
256LAMMP_API void* lmmp_alloc(size_t size, const char* func, int line);
257#define lmmp_alloc(size) lmmp_alloc(size, __func__, __LINE__)
258#else
259/**
260 * @brief 内存分配函数(调用lmmp_heap_alloc_fn)
261 * @param size 要分配的内存字节数
262 * @note 调用堆内存分配器,分配失败将触发 lmmp_abort
263 * @return 返回指向分配内存的指针(分配失败不会 return NULL,而是直接触发 lmmp_abort)
264 */
265LAMMP_API void* lmmp_alloc(size_t size);
266#endif
267
268#if LAMMP_DEBUG_MEMORY_CHECK == 1
269LAMMP_API void* lmmp_realloc(void* ptr, size_t size, const char* func, int line);
270#define lmmp_realloc(ptr, size) lmmp_realloc(ptr, size, __func__, __LINE__)
271#else
272/**
273 * @brief 内存重分配函数(调用lmmp_realloc_fn)
274 * @param ptr 已分配的内存指针
275 * @param size 新的内存大小(字节)
276 * @note 调用堆内存重新分配器,分配失败将触发 lmmp_abort
277 * @return 成功返回指向新内存区域的指针(分配失败不会 return NULL,而是直接触发 lmmp_abort)
278 */
279LAMMP_API void* lmmp_realloc(void* ptr, size_t size);
280#endif
281
282#if LAMMP_DEBUG_MEMORY_CHECK == 1
283LAMMP_API void lmmp_free(void* ptr, const char* func, int line);
284#define lmmp_free(ptr) lmmp_free(ptr, __func__, __LINE__)
285#else
286/**
287 * @brief 内存释放函数(调用lmmp_heap_free_fn)
288 * @param ptr 要释放的内存指针
289 */
290LAMMP_API void lmmp_free(void* ptr);
291#endif
292
293/**
294 * @brief 堆内存分配计数器(线程局部)
295 * @param cnt 若不为0,则将堆内存计数器置为cnt
296 * @return 返回当前的heap分配计数(如果被设置,即返回旧的计数值),即目前未被释放的堆内存数量
297 */
298LAMMP_API int lmmp_alloc_count(int cnt);
299
300/**
301 * @brief 内存泄漏检测器
302 * @param func 泄漏发生的函数名
303 * @param line 泄漏发生的行号
304 * @warning 内存计数器均是线程局部的,仅会检测单线程的内存泄漏。
305 * @note 将会同时检验堆内存和栈内存,若堆内存计数器不为0,或栈内存的栈顶不在栈底,都会触发lmmp_abort
306 * 两者同时发生则将输出两者的信息。
307 */
308LAMMP_API void lmmp_leak_tracker(const char* func, int line);
309
310#if LAMMP_DEBUG_MEMORY_LEAK == 1
311// 同时检验堆内存和栈内存,若堆内存计数器不为0,或栈内存的栈顶不在栈底,都会触发lmmp_abort
312// 两者同时发生则将输出两者的信息。
313// 请注意,内存计数器均是线程局部的,仅会检测单线程的内存泄漏。
314#define lmmp_leak_tracker lmmp_leak_tracker(__func__, __LINE__)
315#else
316#define lmmp_leak_tracker ((void)0)
317#endif
318
319#if LAMMP_DEBUG_MEMORY_CHECK == 1
320LAMMP_API void* lmmp_stack_alloc(size_t size, const char* func, int line);
321#define lmmp_stack_alloc(size) lmmp_stack_alloc(size, __func__, __LINE__)
322#else
323/**
324 * @brief 栈内存分配函数(使用stack_get_top和stack_set_top)
325 * @param size 要分配的内存字节数
326 * @warning 请严格按照分配顺序的逆序释放内存,否则会导致未定义行为或导致栈溢出触发lmmp_abort
327 * 且严禁用于分配持久内存,如全局变量等。
328 * @return 成功返回指向分配内存的指针,栈溢出时,会触发lmmp_abort
329 */
330LAMMP_API void* lmmp_stack_alloc(size_t size);
331#endif
332
333#if LAMMP_DEBUG_MEMORY_CHECK == 1
334LAMMP_API void lmmp_stack_free(void* ptr, const char* func, int line);
335#define lmmp_stack_free(ptr) lmmp_stack_free(ptr, __func__, __LINE__)
336#else
337/**
338 * @brief 栈内存释放函数(使用stack_get_top和stack_set_top)
339 * @param ptr 要释放的内存指针
340 * @warning 请严格按照分配顺序的逆序释放内存(后分配者先释放)
341 */
342LAMMP_API void lmmp_stack_free(void* ptr);
343#endif
344
345// 计算整数的绝对值
346#define LMMP_ABS(x) ((x) >= 0 ? (x) : -(x))
347// 返回两个数中的较小值
348#define LMMP_MIN(l, o) ((l) < (o) ? (l) : (o))
349// 返回两个数中的较大值
350#define LMMP_MAX(h, i) ((h) > (i) ? (h) : (i))
351// 交换两个同类型变量的值
352#define LMMP_SWAP(x, y, type) \
353 do { \
354 type _swap_ = (x); \
355 (x) = (y); \
356 (y) = _swap_; \
357 } while (0)
358// 检查n是否为2的整数次幂
359#define LMMP_POW2_Q(n) (((n) & ((n) - 1)) == 0)
360// 将a向上取整为m的整数倍
361#define LMMP_ROUND_UP_MULTIPLE(a, m) ((a) + (m) - 1 - ((a) + (m) - 1) % (m))
362
363// 内存拷贝宏:拷贝n个limb(每个8字节),使用memmove保证重叠安全
364#define lmmp_copy(dst, src, n) memmove(dst, src, (n) << 3)
365// 内存置零宏:将n个limb置零(每个8字节)
366#define lmmp_zero(dst, n) memset(dst, 0, (n) << 3)
367
368// 断言宏:检查条件x是否成立,不成立则触发段错误(严格的错误检查)
369// RELEASE 版本也会检查
370#define lmmp_assert(x) \
371 do { \
372 if (!(x)) { \
373 lmmp_abort(LAMMP_ERROR_ASSERT_FAILURE, #x, __func__, __LINE__); \
374 } \
375 } while (0)
376
377#if LAMMP_DEBUG_ASSERT_CHECK == 1
378// 调试断言宏:检查条件x是否成立,不成立则触发段错误(调试版本)
379#define lmmp_debug_assert(x) \
380 do { \
381 if (!(x)) { \
382 lmmp_abort(LAMMP_ERROR_DEBUG_ASSERT_FAILURE, #x, __func__, __LINE__); \
383 } \
384 } while (0)
385#else
386// 调试断言宏:检查条件x是否成立,不成立则触发段错误(调试版本)
387#define lmmp_debug_assert(x) ((void)0)
388#endif
389
390#if LAMMP_DEBUG_PARAM_ASSERT_CHECK == 1
391#define lmmp_param_assert(x) \
392 do { \
393 if (!(x)) { \
394 lmmp_abort(LAMMP_ERROR_PARAM_ASSERT_FAILURE, #x, __func__, __LINE__); \
395 } \
396 } while (0)
397#else
398#define lmmp_param_assert(x) ((void)0)
399#endif
400
401/**
402 * @brief 全局初始化函数(线程局部的)
403 * @note 调用此函数将初始化全局范围内的所有线程局部资源,如栈式分配器等。
404 * 部分惰性初始化的资源将在首次使用时初始化。调用此函数不会进行初始化。
405 * 此函数可重入,多次调用不会导致重复初始化。
406 * @warning 我们建议在进程或线程启动时调用此函数,以保证线程安全。
407 */
408LAMMP_API void lmmp_global_init(void);
409
410/**
411 * @brief (线程局部的)全局共享的动态分配的堆内存资源释放函数
412 * @note 调用此函数将释放全局范围内的所有动态分配的堆内存资源。
413 * 此函数可重入,多次调用不会导致重复释放。如需要再次使用,请重新调用 lmmp_global_init 初始化。
414 * 部分惰性初始化的资源将在再次首次使用时再次初始化,调用此函数可能导致部分缓存失效,导致性能下降。
415 * @warning 我们建议在线程结束时或程序进程结束时调用此函数。多线程下,每个线程都会拥有独立的副本,
416 * 未调用此函数结束线程可能导致内存泄漏。
417 */
419
420#ifdef __cplusplus
421} // extern "C"
422#endif
423
424#endif // LAMMP_LMMP_H
void * lmmp_stack_alloc(size_t size)
栈内存分配函数(使用stack_get_top和stack_set_top)
Definition memory.c:218
void * lmmp_realloc(void *ptr, size_t size)
内存重分配函数(调用lmmp_realloc_fn)
Definition memory.c:186
mp_limb_t * mp_ptr
Definition lmmp.h:215
uint8_t mp_byte_t
Definition lmmp.h:210
void lmmp_set_heap_allocator(const lmmp_heap_allocator_t *heap)
设置 LAMMP 全局堆内存分配函数
Definition memory.c:76
void(* lmmp_heap_free_fn)(void *ptr)
Definition lmmp.h:88
lmmp_realloc_fn realloc
Definition lmmp.h:94
lmmp_heap_alloc_fn alloc
Definition lmmp.h:92
size_t mp_bitcnt_t
Definition lmmp.h:217
uint64_t mp_size_t
Definition lmmp.h:212
int64_t mp_slimb_t
Definition lmmp.h:213
void * lmmp_alloc(size_t size)
内存分配函数(调用lmmp_heap_alloc_fn)
Definition memory.c:166
const mp_limb_t * mp_srcptr
Definition lmmp.h:216
void *(* lmmp_realloc_fn)(void *ptr, size_t size)
Definition lmmp.h:89
void lmmp_stack_free(void *ptr)
栈内存释放函数(使用stack_get_top和stack_set_top)
Definition memory.c:238
lmmp_abort_fn lmmp_set_abort_fn(lmmp_abort_fn func)
设置 LAMMP 全局退出函数(所有线程均生效)
Definition abort.c:14
void lmmp_abort(lmmp_error_t type, const char *msg, const char *func, int line)
LAMMP 全局退出函数,内部错误或断言失败时调用,若设置了全局退出函数,则会调用该函数,否则会调用默认的退出函数。
Definition abort.c:42
#define STATIC_ASSERT(cond, msg)
Definition lmmp.h:246
void lmmp_stack_reset(size_t size)
LAMMP 全局栈重置函数(通常不需要手动调用)
Definition memory.c:39
void lmmp_free(void *ptr)
内存释放函数(调用lmmp_heap_free_fn)
Definition memory.c:204
lmmp_heap_free_fn free
Definition lmmp.h:93
int64_t mp_ssize_t
Definition lmmp.h:214
void lmmp_global_init(void)
全局初始化函数(线程局部的)
Definition memory.c:402
uint64_t mp_limb_t
Definition lmmp.h:211
void *(* lmmp_heap_alloc_fn)(size_t size)
Definition lmmp.h:87
void lmmp_global_deinit(void)
(线程局部的)全局共享的动态分配的堆内存资源释放函数
Definition memory.c:406
void(* lmmp_abort_fn)(lmmp_error_t type, const char *msg, const char *func, int line)
LAMMP 全局退出函数指针类型
Definition lmmp.h:150
lmmp_error_t
Definition lmmp.h:132
@ LAMMP_ERROR_MEMORY_ALLOC_FAILURE
Definition lmmp.h:136
@ LAMMP_ERROR_DEBUG_ASSERT_FAILURE
Definition lmmp.h:134
@ LAMMP_ERROR_UNEXPECTED_ERROR
Definition lmmp.h:140
@ LAMMP_ERROR_MEMORY_LEAK
Definition lmmp.h:139
@ LAMMP_ERROR_ASSERT_FAILURE
Definition lmmp.h:133
@ LAMMP_ERROR_PARAM_ASSERT_FAILURE
Definition lmmp.h:135
@ LAMMP_ERROR_MEMORY_FREE_FAILURE
Definition lmmp.h:137
@ LAMMP_ERROR_OUT_OF_BOUNDS
Definition lmmp.h:138
#define LAMMP_API
Definition lmmp.h:64
void lmmp_stack_init(void)
LAMMP 全局栈初始化函数(通常不需要手动调用)
Definition memory.c:66
#define lmmp_leak_tracker
Definition lmmp.h:316
int lmmp_alloc_count(int cnt)
堆内存分配计数器(线程局部)
Definition memory.c:123