|
LAMMP 4.1.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 |
宏定义 | |
| #define | LAMMP_API __declspec(dllimport) |
| #define | LAMMP_DEBUG_ASSERT_CHECK 0 |
| #define | LAMMP_DEBUG_MEMORY_CHECK 0 |
| #define | LAMMP_DEBUG_MEMORY_LEAK 0 |
| #define | LAMMP_DEBUG_PARAM_ASSERT_CHECK 0 |
| #define | LAMMP_DEBUG_STACK_OVERFLOW_CHECK 0 |
| #define | LAMMP_MAX_ALIGN 16 |
| #define | LAMMP_MEMORY_MORE_ALLOC_TIMES 1 |
| #define | LAMMP_THREAD_LOCAL _Thread_local |
| #define | LIMB_BITS 64 |
| #define | LIMB_BYTES 8 |
| #define | LIMB_MAX (~(mp_limb_t)0) |
| #define | LLIMB_BITS 32 |
| #define | LLIMB_BYTES 4 |
| #define | LLIMB_MASK ((mp_limb_t)0xffffffff) |
| #define | LMMP_ABS(x) ((x) >= 0 ? (x) : -(x)) |
| #define | lmmp_assert(x) |
| #define | lmmp_copy(dst, src, n) memmove(dst, src, (n) << 3) |
| #define | lmmp_debug_assert(x) ((void)0) |
| #define | lmmp_leak_tracker ((void)0) |
| #define | LMMP_MAX(h, i) ((h) > (i) ? (h) : (i)) |
| #define | LMMP_MIN(l, o) ((l) < (o) ? (l) : (o)) |
| #define | lmmp_param_assert(x) ((void)0) |
| #define | LMMP_POW2_Q(n) (((n) & ((n) - 1)) == 0) |
| #define | LMMP_ROUND_UP_MULTIPLE(a, m) ((a) + (m) - 1 - ((a) + (m) - 1) % (m)) |
| #define | LMMP_SWAP(x, y, type) |
| #define | lmmp_zero(dst, n) memset(dst, 0, (n) << 3) |
| #define | LOG2_LIMB_BITS 6 |
| #define | STATIC_ASSERT(cond, msg) typedef char static_assert_##__LINE__[(cond) ? 1 : -1] |
类型定义 | |
| 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 全局堆内存分配函数 | |
| void * | lmmp_stack_alloc (size_t size) |
| 栈内存分配函数(使用stack_get_top和stack_set_top) | |
| void | lmmp_stack_free (void *ptr) |
| 栈内存释放函数(使用stack_get_top和stack_set_top) | |
| void | lmmp_stack_init (void) |
| LAMMP 全局栈初始化函数(通常不需要手动调用) | |
| void | lmmp_stack_reset (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 lmmp_assert | ( | x | ) |
| #define LMMP_ROUND_UP_MULTIPLE | ( | a, | |
| m | |||
| ) | ((a) + (m) - 1 - ((a) + (m) - 1) % (m)) |
| #define LMMP_SWAP | ( | x, | |
| y, | |||
| type | |||
| ) |
| #define STATIC_ASSERT | ( | cond, | |
| msg | |||
| ) | typedef char static_assert_##__LINE__[(cond) ? 1 : -1] |
| typedef void(* lmmp_abort_fn) (lmmp_error_t type, const char *msg, const char *func, int line) |
| typedef size_t mp_bitcnt_t |
| typedef int64_t mp_slimb_t |
| typedef int64_t mp_ssize_t |
| enum lmmp_error_t |
| void lmmp_abort | ( | lmmp_error_t | type, |
| const char * | msg, | ||
| const char * | func, | ||
| int | line | ||
| ) |
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)为内存分配失败退出,这可能有两种情况:一种情况为分配了堆内存不足,
导致程序崩溃;另一种情况为栈分配器的栈溢出(栈空间不足或其他UB),其中,情况一是会永远进行的,而情况二
只有在定义了 LAMMP_DEBUG_STACK_OVERFLOW_CHECK 宏为 1 的情况下才会触发。
5. MEMORY_FREE_FAILURE (枚举值为5)为内存释放错误,此错误有两种触发可能,一种为堆内存分配释放时,头部信息被损坏
可能源于传入错误的指针,或缓冲区溢出导致此头部损坏。另一种情况为类似的,由栈分配器分配的内存释放时,头部信息损坏
或指针不在栈的范围内,导致释放错误,如不是传入错误指针,则可能为栈分配的前一次内存缓冲区溢出,导致此内存释放时,
头部信息损坏,导致释放无法进行。此类错误错误触发情况较为复杂,LAMMP_DEBUG_MEMORY_CHECK 宏为 1 时,两种情况都
有可能发生,仅定义 LAMMP_DEBUG_STACK_OVERFLOW_CHECK 宏为 1 时,此错误仅可能由栈分配器触发。
6. OUT_OF_BOUNDS (枚举值为6)为数组越界访问导致的退出,通常表明未按规定使用空间。此类型的错误在堆栈分配器中,
均可能触发,但由于栈分配器的特殊性,可能部分越界访问可能被判定为栈溢出,或内存释放错误。具体可尝试查看错误信息。
此类型只会在定义了 LAMMP_DEBUG_MEMORY_CHECK 宏为 1 的情况下才会触发,Release 模式下通常为 0 。
7. MEMORY_LEAK (枚举值为7)为内存泄漏导致的退出,有两种情况,一种情况为堆内存计数器不为0,另一种情况为当前栈帧
不在栈底。此类型的错误需定义 LAMMP_DEBUG_MEMORY_MEMORY_LEAK 宏为 1,才会触发。通常情况下,此错误需要手动调用
lmmp_leak_tracker宏进行检查。但在调用堆分配器重置时,将会显式检查此时的堆计数器是否为0;在进行栈重置时,会显式检
查栈是否为空,若不满足,触发此错误。特别注意,当手动调用检查宏时,在某些情况下,可能会进行一些全局堆资源的初始化,
但未释放,如想正确计数,请先调用 lmmp_global_deinit 进行全局共享的堆资源的安全释放。
8. UNEXPECTED_ERROR (枚举值为8)为其他未知错误导致的退出。
|
引用了 lmmp_abort_func , 以及 type_to_str().
被这些函数引用 check_extra_memory_overflow(), check_memory_block_integrity(), lmmp_alloc_debug(), lmmp_chech_memory(), lmmp_leak_tracker(), lmmp_set_heap_allocator(), lmmp_stack_alloc(), lmmp_stack_free(), lmmp_stack_reset() , 以及 lmmp_temp_stack_alloc_().
函数调用图:
这是这个函数的调用关系图:| void * lmmp_alloc | ( | size_t | size | ) |
内存分配函数(调用lmmp_heap_alloc_fn)
| size | 要分配的内存字节数 |
引用了 heap_alloc_count, heap_alloc_func , 以及 lmmp_chech_memory().
被这些函数引用 lmmp_fft_memstack_() , 以及 lmmp_strong_rng_init_().
函数调用图:
这是这个函数的调用关系图:| int lmmp_alloc_count | ( | int | cnt | ) |
堆内存分配计数器(线程局部)
| cnt | 若不为0,则将堆内存计数器置为cnt |
引用了 heap_alloc_count.
| void lmmp_free | ( | void * | ptr | ) |
内存释放函数(调用lmmp_heap_free_fn)
| ptr | 要释放的内存指针 |
引用了 heap_alloc_count , 以及 heap_free_func.
被这些函数引用 lmmp_fft_memstack_(), lmmp_limb_elem_mul_(), lmmp_mul_fft_(), lmmp_mul_fft_cache_(), lmmp_mul_fft_unbalance_(), lmmp_mullo_fft_(), lmmp_num_heap_free_(), lmmp_num_heap_mul_(), lmmp_prime_cache_free_(), lmmp_prime_int_table_free_(), lmmp_strong_rng_free_(), lmmp_trialdiv_short_() , 以及 lmmp_vec_elem_mul_().
这是这个函数的调用关系图:| void lmmp_global_deinit | ( | void | ) |
(线程局部的)全局共享的动态分配的堆内存资源释放函数
引用了 lmmp_prime_int_table_free_() , 以及 lmmp_stack_reset().
被这些函数引用 lmmp_set_heap_allocator().
函数调用图:
这是这个函数的调用关系图:| void lmmp_global_init | ( | void | ) |
全局初始化函数(线程局部的)
引用了 lmmp_stack_init().
被这些函数引用 lmmp_set_heap_allocator().
函数调用图:
这是这个函数的调用关系图:| void lmmp_leak_tracker | ( | const char * | func, |
| int | line | ||
| ) |
内存泄漏检测器
| func | 泄漏发生的函数名 |
| line | 泄漏发生的行号 |
引用了 heap_alloc_count, LAMMP_ERROR_MEMORY_LEAK, lmmp_abort(), lmmp_stack_begin, lmmp_stack_end , 以及 lmmp_stack_top.
函数调用图:| void * lmmp_realloc | ( | void * | ptr, |
| size_t | size | ||
| ) |
内存重分配函数(调用lmmp_realloc_fn)
| ptr | 已分配的内存指针 |
| size | 新的内存大小(字节) |
引用了 lmmp_chech_memory() , 以及 realloc_func.
被这些函数引用 lmmp_strong_rng_extern_().
函数调用图:
这是这个函数的调用关系图:| lmmp_abort_fn lmmp_set_abort_fn | ( | lmmp_abort_fn | func | ) |
设置 LAMMP 全局退出函数(所有线程均生效)
| func | 退出函数指针,可以为NULL |
引用了 lmmp_abort_func.
| void lmmp_set_heap_allocator | ( | const lmmp_heap_allocator_t * | heap | ) |
设置 LAMMP 全局堆内存分配函数
| heap | 新的堆内存分配器,可以为NULL,表示使用默认的 malloc, free, realloc |
引用了 global_heap, heap_alloc_count, LAMMP_ERROR_MEMORY_LEAK, lmmp_abort(), lmmp_global_deinit() , 以及 lmmp_global_init().
函数调用图:| void * lmmp_stack_alloc | ( | size_t | size | ) |
栈内存分配函数(使用stack_get_top和stack_set_top)
| size | 要分配的内存字节数 |
引用了 LAMMP_ERROR_MEMORY_ALLOC_FAILURE, LAMMP_MAX_ALIGN, lmmp_abort(), LMMP_ROUND_UP_MULTIPLE, lmmp_stack_end, SIZE_SIZE, stack_get_top_func , 以及 stack_set_top_func.
函数调用图:| void lmmp_stack_free | ( | void * | ptr | ) |
栈内存释放函数(使用stack_get_top和stack_set_top)
| ptr | 要释放的内存指针 |
引用了 LAMMP_ERROR_MEMORY_FREE_FAILURE, lmmp_abort(), lmmp_stack_begin, lmmp_stack_end, SIZE_SIZE, stack_get_top_func , 以及 stack_set_top_func.
函数调用图:| void lmmp_stack_init | ( | void | ) |
LAMMP 全局栈初始化函数(通常不需要手动调用)
引用了 heap_alloc_func, LAMMP_DEFAULT_STACK_SIZE, lmmp_stack_begin, lmmp_stack_end , 以及 lmmp_stack_top.
被这些函数引用 lmmp_global_init().
这是这个函数的调用关系图:| void lmmp_stack_reset | ( | size_t | size | ) |
LAMMP 全局栈重置函数(通常不需要手动调用)
| size | 新的默认栈大小,单位为字节(不建议设置少于 256KB 的栈,少于此值可能导致栈溢出) |
引用了 heap_free_func, LAMMP_ERROR_MEMORY_ALLOC_FAILURE, LAMMP_ERROR_MEMORY_LEAK, lmmp_abort(), lmmp_stack_begin, lmmp_stack_end, lmmp_stack_top , 以及 realloc_func.
被这些函数引用 lmmp_global_deinit().
函数调用图:
这是这个函数的调用关系图: