|
LAMMP 4.2.0
Lamina High-Precision Arithmetic Library
|
#include <stddef.h>#include <stdint.h>#include <stdlib.h>#include <string.h>
lmmp.h 的引用(Include)关系图:
此图展示该文件直接或间接的被哪些文件引用了:结构体 | |
| struct | lmmp_heap_allocator_t |
类型定义 | |
| typedef void(* | lmmp_abort_fn) (lmmp_error_t type, const char *msg, const char *func, int line) |
| LAMMP 全局退出函数指针类型 | |
| typedef void *(* | lmmp_heap_alloc_fn) (size_t size) |
| typedef void(* | lmmp_heap_free_fn) (void *ptr) |
| typedef void *(* | lmmp_realloc_fn) (void *ptr, size_t size) |
| typedef size_t | mp_bitcnt_t |
| typedef uint8_t | mp_byte_t |
| typedef uint64_t | mp_limb_t |
| typedef mp_limb_t * | mp_ptr |
| typedef uint64_t | mp_size_t |
| typedef int64_t | mp_slimb_t |
| typedef const mp_limb_t * | mp_srcptr |
| typedef int64_t | mp_ssize_t |
| typedef char | static_assert___LINE__[(sizeof(void *)==8) ? 1 :-1] |
枚举 | |
| enum | lmmp_error_t { LAMMP_ERROR_ASSERT_FAILURE = 1 , LAMMP_ERROR_DEBUG_ASSERT_FAILURE = 2 , LAMMP_ERROR_PARAM_ASSERT_FAILURE = 3 , LAMMP_ERROR_MEMORY_ALLOC_FAILURE = 4 , LAMMP_ERROR_MEMORY_FREE_FAILURE = 5 , LAMMP_ERROR_OUT_OF_BOUNDS = 6 , LAMMP_ERROR_MEMORY_LEAK = 7 , LAMMP_ERROR_UNEXPECTED_ERROR = 8 } |
函数 | |
| void | lmmp_abort (lmmp_error_t type, const char *msg, const char *func, int line) |
| LAMMP 全局退出函数,内部错误或断言失败时调用,若设置了全局退出函数,则会调用该函数,否则会调用默认的退出函数。 | |
| void * | lmmp_alloc (size_t size) |
| 内存分配函数(调用lmmp_heap_alloc_fn) | |
| int | lmmp_alloc_count (int cnt) |
| 堆内存分配计数器(线程局部) | |
| void | lmmp_free (void *ptr) |
| 内存释放函数(调用lmmp_heap_free_fn) | |
| void | lmmp_global_deinit (void) |
| (线程局部的)全局共享的动态分配的堆内存资源释放函数 | |
| void | lmmp_global_init (void) |
| 全局初始化函数(线程局部的) | |
| void | lmmp_leak_tracker (const char *func, int line) |
| 内存泄漏检测器 | |
| void * | lmmp_realloc (void *ptr, size_t size) |
| 内存重分配函数(调用lmmp_realloc_fn) | |
| lmmp_abort_fn | lmmp_set_abort_fn (lmmp_abort_fn func) |
| 设置 LAMMP 全局退出函数(所有线程均生效) | |
| void | lmmp_set_heap_allocator (const lmmp_heap_allocator_t *heap) |
| 设置 LAMMP 全局堆内存分配函数 | |
| int | lmmp_stack_deinit (void) |
| LAMMP 全局栈释放函数(通常不需要手动调用) | |
| int | lmmp_stack_init (size_t size) |
| LAMMP 全局栈初始化函数(通常不需要手动调用) | |
| struct lmmp_heap_allocator_t |
lmmp_heap_allocator_t 的协作图:| 成员变量 | ||
|---|---|---|
| lmmp_heap_alloc_fn | alloc | |
| lmmp_heap_free_fn | free | |
| lmmp_realloc_fn | realloc | |
| #define LAMMP_API __declspec(dllimport) |
| #define LAMMP_DEBUG_STACK_OVERFLOW_CHECK 0 |
Copyright (C) 2026 HJimmyK(Jericho Knox)
This file is part of LAMMP.
LAMMP is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License (LGPL) as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version.
This program is distributed WITHOUT ANY WARRANTY.
| #define LAMMP_NORETURN /* no definition */ |
| #define LAMMP_THREAD_LOCAL _Thread_local |
| typedef size_t mp_bitcnt_t |
| typedef int64_t mp_slimb_t |
| typedef int64_t mp_ssize_t |
LAMMP 全局退出函数,内部错误或断言失败时调用,若设置了全局退出函数,则会调用该函数,否则会调用默认的退出函数。
| msg | 退出信息,assert类型的错误信息通常仅包含断言内容,其他类型的错误则因类型不同而不同。 |
| func | 退出处的函数名 |
| line | 退出处的行号 |
| type | 退出类型。有以下几个类型: 1. ASSERT_FAILURE (枚举值为1)为lmmp_assert触发的退出,lmmp_assert触发的普通退出几乎不可能发生,
其通常代表不可能发生的计算错误,可能表明程序执行此处时必须正确的输入错误。比如预期无进位的加法产生了进位。
此类错误不可接受,会导致计算无法继续进行,导致程序崩溃。
2. DEBUG_ASSERT_FAILURE (枚举值为2)为lmmp_debug_assert触发的退出。其通常表明预期之外的错误,
这通常是调用者的UB,如无UB的情况下触发此错误;也可能是LAMMP内部的逻辑错误,开发者期待的输入错误,
在该逻辑处仅简单考虑了某些情况。如有此类错误,可以报告给开发者。此类型只会在定义了
LAMMP_DEBUG_ASSERT_CHECK 宏为 1 的情况下才会触发。
3. PARAM_ASSERT_FAILURE (枚举值为3)为参数检查失败导致的退出。其通常表明调用者传入了无效的参数,
导致函数的行为不符合预期。此类错误不可接受,会导致计算无法继续进行,导致程序崩溃。此类型的错误只有在
定义了 LAMMP_DEBUG_PARAM_ASSERT_CHECK 宏为 1 的情况下才会触发。
4. MEMORY_ALLOC_FAILURE (枚举值为4)为内存分配失败退出。在使用堆分配器时,申请内存失败,导致触发此错误。
此类型错误不受明确的宏调控,Realse模式下,会保留必要的触发场景,部分场景下,在一些检查宏定义时,可能会额外触发此错误。
5. MEMORY_FREE_FAILURE (枚举值为5)为内存释放错误。当释放堆内存时可能触发,原因通常为头部信息被损坏,极有可能
源于传入错误的指针,又或者缓冲区溢出导致此头部损坏。LAMMP_DEBUG_MEMORY_CHECK 宏为 1 时,才可能触发。
6. OUT_OF_BOUNDS (枚举值为6)为数组越界访问导致的退出。通常表明未按规定使用空间。此类型的错误在堆分配器中,当释放
堆内存时,检测到数组尾部魔数不匹配,导致此错误。LAMMP_DEBUG_MEMORY_CHECK 宏为 1 时,才可能触发。
7. MEMORY_LEAK (枚举值为7)为内存泄漏导致的退出。在检查点处,堆内存计数器不为0,或者当前栈帧不在栈底,又或者缓冲池
定不在缓冲池底,都会触发此错误。触发原因可能为,在调用堆分配器重置函数时,显式检查到此时的堆计数器不为0或者栈帧
以及缓冲池不为底部。又或者手动调用 lmmp_leak_tracker 宏来进行检查,检查到了相同的情况。需注意,手动调用此宏时,
请先调用 lmmp_global_deinit 进行全局共享的堆资源的安全释放(因为部分全局共享资源也会被计数)。
8. UNEXPECTED_ERROR (枚举值为8)为其他未知错误导致的退出。
|
引用了 abort_func_lock(), abort_func_unlock(), lmmp_abort_func, n , 以及 type_to_str().
被这些函数引用 check_extra_memory_overflow(), check_memory_block_integrity(), lmmp_alloc_debug(), lmmp_chech_memory(), lmmp_leak_tracker(), lmmp_realloc_debug(), lmmp_stack_init(), lmmp_temp_heap_alloc_() , 以及 lmmp_temp_stack_alloc_().
函数调用图:
这是这个函数的调用关系图:| void * lmmp_alloc | ( | size_t | size | ) |
内存分配函数(调用lmmp_heap_alloc_fn)
| size | 要分配的内存字节数 |
引用了 heap_alloc_count, heap_alloc_func, lmmp_chech_memory() , 以及 n.
被这些函数引用 lmmp_fft_memstack_() , 以及 lmmp_strong_rng_init_().
函数调用图:
这是这个函数的调用关系图:| int lmmp_alloc_count | ( | int | cnt | ) |
堆内存分配计数器(线程局部)
| cnt | 若不为0,则将堆内存计数器置为cnt |
引用了 heap_alloc_count , 以及 n.
内存释放函数(调用lmmp_heap_free_fn)
| ptr | 要释放的内存指针 |
引用了 heap_alloc_count , 以及 heap_free_func.
被这些函数引用 lmmp_fft_memstack_(), lmmp_huff_tree_free_(), lmmp_mul_fft_(), lmmp_mul_fft_cache_(), lmmp_mul_fft_unbalance_(), lmmp_mullo_fft_(), lmmp_prime_cache_free_(), lmmp_prime_int_table_free_(), lmmp_strong_rng_free_() , 以及 lmmp_trialdiv_short_().
这是这个函数的调用关系图:(线程局部的)全局共享的动态分配的堆内存资源释放函数
引用了 lmmp_prime_int_table_free_() , 以及 lmmp_stack_deinit().
被这些函数引用 lmmp_set_heap_allocator().
函数调用图:
这是这个函数的调用关系图:全局初始化函数(线程局部的)
引用了 LAMMP_POOL_SIZE , 以及 lmmp_stack_init().
被这些函数引用 lmmp_set_heap_allocator().
函数调用图:
这是这个函数的调用关系图:内存泄漏检测器
| func | 泄漏发生的函数名 |
| line | 泄漏发生的行号 |
引用了 lmmp_memory_ctx::capacity, heap_alloc_count, LAMMP_ERROR_MEMORY_LEAK, lmmp_abort(), lmmp_tmpmem_ctx, n, lmmp_memory_ctx::pool_begin, lmmp_memory_ctx::pool_top, lmmp_memory_ctx::remain, lmmp_memory_ctx::stack_begin, lmmp_memory_ctx::stack_end, lmmp_memory_ctx::stack_top , 以及 t.
函数调用图:内存重分配函数(调用lmmp_realloc_fn)
| ptr | 已分配的内存指针 |
| size | 新的内存大小(字节) |
引用了 lmmp_chech_memory(), n , 以及 realloc_func.
被这些函数引用 lmmp_strong_rng_extern_().
函数调用图:
这是这个函数的调用关系图:| lmmp_abort_fn lmmp_set_abort_fn | ( | lmmp_abort_fn | func | ) |
设置 LAMMP 全局退出函数(所有线程均生效)
| func | 退出函数指针,可以为NULL |
引用了 abort_func_lock(), abort_func_unlock(), lmmp_abort_func , 以及 n.
函数调用图:| void lmmp_set_heap_allocator | ( | const lmmp_heap_allocator_t * | heap | ) |
设置 LAMMP 全局堆内存分配函数
| heap | 新的堆内存分配器,可以为NULL,此时会直接返回,而不进行任何操作。 |
引用了 global_heap, lmmp_global_deinit(), lmmp_global_init(), lmmp_leak_tracker , 以及 n.
函数调用图:| int lmmp_stack_deinit | ( | void | ) |
LAMMP 全局栈释放函数(通常不需要手动调用)
引用了 lmmp_memory_ctx::capacity, heap_free_func, lmmp_tmpmem_ctx, n, lmmp_memory_ctx::pool_begin, lmmp_memory_ctx::pool_top, lmmp_memory_ctx::remain, lmmp_memory_ctx::stack_begin, lmmp_memory_ctx::stack_end , 以及 lmmp_memory_ctx::stack_top.
被这些函数引用 lmmp_global_deinit().
这是这个函数的调用关系图:| int lmmp_stack_init | ( | size_t | size | ) |
LAMMP 全局栈初始化函数(通常不需要手动调用)
引用了 lmmp_memory_ctx::capacity, heap_alloc_func, heap_free_func, LAMMP_DEFAULT_STACK_SIZE, LAMMP_ERROR_MEMORY_ALLOC_FAILURE, LAMMP_MAX_ALIGN, lmmp_abort(), lmmp_tmpmem_ctx, n, lmmp_memory_ctx::pool_begin, lmmp_memory_ctx::pool_top, lmmp_memory_ctx::remain, lmmp_memory_ctx::stack_begin, lmmp_memory_ctx::stack_end , 以及 lmmp_memory_ctx::stack_top.
被这些函数引用 lmmp_global_init().
函数调用图:
这是这个函数的调用关系图: