LAMMP 4.1.0
Lamina High-Precision Arithmetic Library
载入中...
搜索中...
未找到
tmp_alloc.h 文件参考
#include "../lmmp.h"
#include <stdio.h>
+ tmp_alloc.h 的引用(Include)关系图:
+ 此图展示该文件直接或间接的被哪些文件引用了:

浏览源代码.

宏定义

#define ALLOC_TYPE(n, type)   ((type*)lmmp_alloc((size_t)(n) * sizeof(type)))
 
#define BALLOC_TYPE(n, type)   ((type*)TEMP_BALLOC((n) * sizeof(type)))
 
#define REALLOC_TYPE(p, new_size, type)   ((type*)lmmp_realloc((p), (new_size) * sizeof(type)))
 
#define SALLOC_TYPE(n, type)   ((type*)TEMP_SALLOC((n) * sizeof(type)))
 
#define TALLOC_TYPE(n, type)   ((type*)TEMP_TALLOC((n) * sizeof(type)))
 
#define TEMP_B_DECL   void* lmmp_temp_alloc_marker_ = NULL
 
#define TEMP_B_FREE
 
#define TEMP_BALLOC(n)   lmmp_temp_heap_alloc_(&lmmp_temp_alloc_marker_, (n))
 
#define TEMP_DECL    void *lmmp_temp_alloc_marker_ = NULL, *lmmp_temp_stack_marker_ = NULL
 
#define TEMP_FREE
 
#define TEMP_S_DECL   void* lmmp_temp_stack_marker_ = NULL
 
#define TEMP_S_FREE
 
#define TEMP_SALLOC(n)   lmmp_temp_stack_alloc_(&lmmp_temp_stack_marker_, (n))
 
#define TEMP_SALLOC_THRESHOLD   0x7f00
 
#define TEMP_TALLOC(n)   ((n) <= TEMP_SALLOC_THRESHOLD ? TEMP_SALLOC(n) : TEMP_BALLOC(n))
 

函数

void * lmmp_temp_heap_alloc_ (void **pmarker, size_t size)
 临时堆内存分配函数
 
void lmmp_temp_heap_free_ (void *marker)
 临时堆内存释放函数
 
static void * lmmp_temp_stack_alloc_ (void **pmarker, size_t size)
 
static void lmmp_temp_stack_free_ (void *marker)
 

变量

_Thread_local void * lmmp_stack_begin
 
_Thread_local void * lmmp_stack_end
 
_Thread_local void * lmmp_stack_top
 

宏定义说明

◆ ALLOC_TYPE

#define ALLOC_TYPE (   n,
  type 
)    ((type*)lmmp_alloc((size_t)(n) * sizeof(type)))

在文件 tmp_alloc.h112 行定义.

◆ BALLOC_TYPE

#define BALLOC_TYPE (   n,
  type 
)    ((type*)TEMP_BALLOC((n) * sizeof(type)))

在文件 tmp_alloc.h89 行定义.

◆ REALLOC_TYPE

#define REALLOC_TYPE (   p,
  new_size,
  type 
)    ((type*)lmmp_realloc((p), (new_size) * sizeof(type)))

在文件 tmp_alloc.h114 行定义.

◆ SALLOC_TYPE

#define SALLOC_TYPE (   n,
  type 
)    ((type*)TEMP_SALLOC((n) * sizeof(type)))

在文件 tmp_alloc.h87 行定义.

◆ TALLOC_TYPE

#define TALLOC_TYPE (   n,
  type 
)    ((type*)TEMP_TALLOC((n) * sizeof(type)))

在文件 tmp_alloc.h91 行定义.

◆ TEMP_B_DECL

#define TEMP_B_DECL   void* lmmp_temp_alloc_marker_ = NULL

在文件 tmp_alloc.h75 行定义.

◆ TEMP_B_FREE

#define TEMP_B_FREE
值:
do { \
if (lmmp_temp_alloc_marker_) \
lmmp_temp_heap_free_(lmmp_temp_alloc_marker_); \
} while (0)

在文件 tmp_alloc.h100 行定义.

101 { \
102 if (lmmp_temp_alloc_marker_) \
103 lmmp_temp_heap_free_(lmmp_temp_alloc_marker_); \
104 } while (0)

◆ TEMP_BALLOC

#define TEMP_BALLOC (   n)    lmmp_temp_heap_alloc_(&lmmp_temp_alloc_marker_, (n))

在文件 tmp_alloc.h83 行定义.

◆ TEMP_DECL

#define TEMP_DECL    void *lmmp_temp_alloc_marker_ = NULL, *lmmp_temp_stack_marker_ = NULL

在文件 tmp_alloc.h72 行定义.

◆ TEMP_FREE

#define TEMP_FREE
值:
do { \
if (lmmp_temp_alloc_marker_) \
lmmp_temp_heap_free_(lmmp_temp_alloc_marker_); \
if (lmmp_temp_stack_marker_) \
lmmp_temp_stack_free_(lmmp_temp_stack_marker_); \
} while (0)

在文件 tmp_alloc.h93 行定义.

94 { \
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_); \
99 } while (0)

◆ TEMP_S_DECL

#define TEMP_S_DECL   void* lmmp_temp_stack_marker_ = NULL

在文件 tmp_alloc.h76 行定义.

◆ TEMP_S_FREE

#define TEMP_S_FREE
值:
do { \
if (lmmp_temp_stack_marker_) \
lmmp_temp_stack_free_(lmmp_temp_stack_marker_); \
} while (0)

在文件 tmp_alloc.h105 行定义.

106 { \
107 if (lmmp_temp_stack_marker_) \
108 lmmp_temp_stack_free_(lmmp_temp_stack_marker_); \
109 } while (0)

◆ TEMP_SALLOC

#define TEMP_SALLOC (   n)    lmmp_temp_stack_alloc_(&lmmp_temp_stack_marker_, (n))

在文件 tmp_alloc.h81 行定义.

◆ TEMP_SALLOC_THRESHOLD

#define TEMP_SALLOC_THRESHOLD   0x7f00

在文件 tmp_alloc.h78 行定义.

◆ TEMP_TALLOC

#define TEMP_TALLOC (   n)    ((n) <= TEMP_SALLOC_THRESHOLD ? TEMP_SALLOC(n) : TEMP_BALLOC(n))

在文件 tmp_alloc.h85 行定义.

函数说明

◆ lmmp_temp_heap_alloc_()

void * lmmp_temp_heap_alloc_ ( void **  pmarker,
size_t  size 
)

临时堆内存分配函数

参数
pmarker标记
size要分配的内存字节数

在文件 memory.c91 行定义.

91 {
92 /*
93 * pmarker is a head pointer to a linked list of allocated memory blocks.
94 * Each allocated block has a header of size HSIZE, which is used to store the
95 * next pointer of the block. The actual data starts at (mp_byte_t*)p + offset.
96 */
97 const size_t offset = LMMP_ROUND_UP_MULTIPLE(HSIZE, LAMMP_MAX_ALIGN);
98 void* p = heap_alloc_func(size + offset);
99 *(void**)p = *pmarker;
100 *pmarker = p;
101 return (mp_byte_t*)p + offset;
102}
uint8_t mp_byte_t
Definition lmmp.h:210
#define LAMMP_MAX_ALIGN
Definition lmmp.h:219
#define LMMP_ROUND_UP_MULTIPLE(a, m)
Definition lmmp.h:361
#define heap_alloc_func
Definition memory.c:26
#define HSIZE
Definition memory.c:18

引用了 heap_alloc_func, HSIZE, LAMMP_MAX_ALIGN , 以及 LMMP_ROUND_UP_MULTIPLE.

◆ lmmp_temp_heap_free_()

void lmmp_temp_heap_free_ ( void *  marker)

临时堆内存释放函数

参数
marker要释放的临时内存标记

在文件 memory.c104 行定义.

104 {
105 /*
106 * Free all allocated memory blocks in the linked list pointed to by pmarker.
107 */
108 while (marker) {
109 void* next = *(void**)marker;
110 heap_free_func(marker);
111 marker = next;
112 }
113}
#define heap_free_func
Definition memory.c:27

引用了 heap_free_func.

◆ lmmp_temp_stack_alloc_()

static void * lmmp_temp_stack_alloc_ ( void **  pmarker,
size_t  size 
)
inlinestatic

在文件 tmp_alloc.h42 行定义.

42 {
43 /*
44 * On the first call, *pmarker is a null pointer.
45 * We will use *pmarker to record the stack frame at this time.
46 * When allocating memory subsequently, we will not modify *pmarker.
47 * Until all stack memory is finally released, we will move to the initial stack position at once,
48 * which is the position recorded by *pmarker.
49 */
50 void* p = lmmp_stack_top;
51 size_t offset = LMMP_ROUND_UP_MULTIPLE(size, LAMMP_MAX_ALIGN);
52 void* new_top = (void*)((mp_byte_t*)p + offset);
53#if LAMMP_DEBUG_STACK_OVERFLOW_CHECK == 1
54 if (new_top > lmmp_stack_end) {
55 char msg[128];
56 snprintf(msg, sizeof(msg), "Stack overflow (trying to allocate: %zu bytes, stack remaining: %zu bytes)", offset,
58 lmmp_abort(LAMMP_ERROR_MEMORY_ALLOC_FAILURE, msg, __func__, __LINE__);
59 }
60#endif
61 lmmp_stack_top = new_top;
62 if (*pmarker == NULL)
63 *pmarker = p;
64 return p;
65}
void lmmp_abort(lmmp_error_t type, const char *msg, const char *func, int line)
LAMMP 全局退出函数,内部错误或断言失败时调用,若设置了全局退出函数,则会调用该函数,否则会调用默认的退出函数。
Definition abort.c:42
@ LAMMP_ERROR_MEMORY_ALLOC_FAILURE
Definition lmmp.h:136
_Thread_local void * lmmp_stack_top
Definition memory.c:34
_Thread_local void * lmmp_stack_end
Definition memory.c:33

引用了 LAMMP_ERROR_MEMORY_ALLOC_FAILURE, LAMMP_MAX_ALIGN, lmmp_abort(), LMMP_ROUND_UP_MULTIPLE, lmmp_stack_end , 以及 lmmp_stack_top.

+ 函数调用图:

◆ lmmp_temp_stack_free_()

static void lmmp_temp_stack_free_ ( void *  marker)
inlinestatic

在文件 tmp_alloc.h67 行定义.

67 {
68 lmmp_stack_top = marker;
69}

引用了 lmmp_stack_top.

变量说明

◆ lmmp_stack_begin

_Thread_local void* lmmp_stack_begin
extern

在文件 memory.c32 行定义.

被这些函数引用 lmmp_leak_tracker(), lmmp_stack_free(), lmmp_stack_init() , 以及 lmmp_stack_reset().

◆ lmmp_stack_end

_Thread_local void* lmmp_stack_end
extern

◆ lmmp_stack_top

_Thread_local void* lmmp_stack_top
extern