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

浏览源代码.

结构体

struct  lmmp_alloc_marker
 
struct  lmmp_memory_ctx
 Copyright (C) 2026 HJimmyK(Jericho Knox) 更多...
 

宏定义

#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 HSIZE   sizeof(void*)
 
#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   TEMP_DECL
 
#define TEMP_B_FREE
 
#define TEMP_BALLOC(n)   lmmp_temp_pool_alloc_(&__lmmp_marker_, (n))
 
#define TEMP_DECL   lmmp_alloc_marker __lmmp_marker_ = {NULL, NULL, NULL}
 
#define TEMP_FREE
 
#define TEMP_S_DECL   TEMP_DECL
 
#define TEMP_S_FREE
 
#define TEMP_SALLOC(n)   lmmp_temp_stack_alloc_(&__lmmp_marker_, (n))
 
#define TEMP_SALLOC_THRESHOLD   0x7f00
 
#define TEMP_TALLOC(n)   ((n) <= TEMP_SALLOC_THRESHOLD ? TEMP_SALLOC(n) : TEMP_BALLOC(n))
 

函数

static voidlmmp_temp_heap_alloc_ (lmmp_alloc_marker *pmarker, size_t size)
 
static void lmmp_temp_heap_free_ (lmmp_alloc_marker *pmarker)
 
static voidlmmp_temp_pool_alloc_ (lmmp_alloc_marker *pmarker, size_t size)
 
static void lmmp_temp_pool_free_ (lmmp_alloc_marker *pmarker)
 
static voidlmmp_temp_stack_alloc_ (lmmp_alloc_marker *pmarker, size_t size)
 
static void lmmp_temp_stack_free_ (lmmp_alloc_marker *pmarker)
 

变量

_Thread_local lmmp_heap_allocator_t global_heap
 
_Thread_local lmmp_memory_ctx lmmp_tmpmem_ctx
 

结构体说明

◆ lmmp_alloc_marker

struct lmmp_alloc_marker

在文件 tmp_alloc.h35 行定义.

+ lmmp_alloc_marker 的协作图:
成员变量
void * heap_marker
void * pool_marker
void * stack_marker

◆ lmmp_memory_ctx

struct lmmp_memory_ctx

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.

See https://www.gnu.org/licenses/.

在文件 tmp_alloc.h22 行定义.

+ lmmp_memory_ctx 的协作图:
成员变量
size_t capacity
void * pool_begin
void * pool_top
size_t remain
void * stack_begin
void * stack_end
void * stack_top

宏定义说明

◆ ALLOC_TYPE

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

在文件 tmp_alloc.h173 行定义.

◆ BALLOC_TYPE

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

在文件 tmp_alloc.h146 行定义.

◆ HSIZE

#define HSIZE   sizeof(void*)

◆ REALLOC_TYPE

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

在文件 tmp_alloc.h175 行定义.

◆ SALLOC_TYPE

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

在文件 tmp_alloc.h144 行定义.

◆ TALLOC_TYPE

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

在文件 tmp_alloc.h148 行定义.

◆ TEMP_B_DECL

#define TEMP_B_DECL   TEMP_DECL

在文件 tmp_alloc.h132 行定义.

◆ TEMP_B_FREE

#define TEMP_B_FREE
值:
do { \
if (__lmmp_marker_.pool_marker != NULL) \
if (__lmmp_marker_.heap_marker != NULL) \
} while (0)
#define n

在文件 tmp_alloc.h159 行定义.

160 { \
161 if (__lmmp_marker_.pool_marker != NULL) \
163 if (__lmmp_marker_.heap_marker != NULL) \
165 } while (0)

◆ TEMP_BALLOC

#define TEMP_BALLOC (   n)    lmmp_temp_pool_alloc_(&__lmmp_marker_, (n))

在文件 tmp_alloc.h140 行定义.

◆ TEMP_DECL

在文件 tmp_alloc.h131 行定义.

◆ TEMP_FREE

#define TEMP_FREE

◆ TEMP_S_DECL

#define TEMP_S_DECL   TEMP_DECL

在文件 tmp_alloc.h133 行定义.

◆ TEMP_S_FREE

#define TEMP_S_FREE
值:
do { \
if (__lmmp_marker_.stack_marker != NULL) \
} while (0)

在文件 tmp_alloc.h166 行定义.

167 { \
168 if (__lmmp_marker_.stack_marker != NULL) \
170 } while (0)

◆ TEMP_SALLOC

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

在文件 tmp_alloc.h138 行定义.

◆ TEMP_SALLOC_THRESHOLD

#define TEMP_SALLOC_THRESHOLD   0x7f00

在文件 tmp_alloc.h135 行定义.

◆ TEMP_TALLOC

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

在文件 tmp_alloc.h142 行定义.

函数说明

◆ lmmp_temp_heap_alloc_()

static void * lmmp_temp_heap_alloc_ ( lmmp_alloc_marker pmarker,
size_t  size 
)
inlinestatic

在文件 tmp_alloc.h41 行定义.

41 {
42 /*
43 * pmarker->heap_marker is a head pointer to a linked list of allocated memory blocks.
44 * Each allocated block has a header of size HSIZE, which is used to store the
45 * next pointer of the block. The actual data starts at (mp_byte_t*)p + offset.
46 */
47 // 在经过缓冲池后,size已经对齐至LAMMP_MAX_ALIGN
48 // size = LMMP_ROUND_UP_MULTIPLE(size, LAMMP_MAX_ALIGN);
49#define HSIZE sizeof(void*)
51#undef HSIZE
52 void* p = global_heap.alloc(size + offset);
53#if LAMMP_DEBUG_MEMORY_CHECK == 1
54 if (p == NULL) {
55 char msg[128];
56 snprintf(msg, sizeof(msg), "Memory allocation failure (trying to allocate: %zu bytes)", size);
58 }
59#endif
60 *(void**)p = pmarker->heap_marker;
61 pmarker->heap_marker = p;
62 return (mp_byte_t*)p + offset;
63}
uint8_t mp_byte_t
Definition lmmp.h:75
#define LAMMP_MAX_ALIGN
Definition lmmp.h:84
lmmp_heap_alloc_fn alloc
Definition lmmp.h:170
void lmmp_abort(lmmp_error_t type, const char *msg, const char *func, int line)
LAMMP 全局退出函数,内部错误或断言失败时调用,若设置了全局退出函数,则会调用该函数,否则会调用默认的退出函数。
Definition abort.c:102
@ LAMMP_ERROR_MEMORY_ALLOC_FAILURE
Definition lmmp.h:215
#define LMMP_ROUND_UP_MULTIPLE(a, m)
Definition lmmp.h:364
#define HSIZE
_Thread_local lmmp_heap_allocator_t global_heap
Definition memory.c:29

引用了 lmmp_heap_allocator_t::alloc, global_heap, HSIZE, LAMMP_ERROR_MEMORY_ALLOC_FAILURE, LAMMP_MAX_ALIGN, lmmp_abort(), LMMP_ROUND_UP_MULTIPLE , 以及 n.

被这些函数引用 lmmp_temp_pool_alloc_().

+ 函数调用图:
+ 这是这个函数的调用关系图:

◆ lmmp_temp_heap_free_()

static void lmmp_temp_heap_free_ ( lmmp_alloc_marker pmarker)
inlinestatic

在文件 tmp_alloc.h65 行定义.

65 {
66 /*
67 * Free all allocated memory blocks in the linked list pointed to by pmarker->heap_marker.
68 */
69 while (pmarker->heap_marker) {
70 void* next = *(void**)(pmarker->heap_marker);
71 global_heap.free(pmarker->heap_marker);
72 pmarker->heap_marker = next;
73 }
74}
lmmp_heap_free_fn free
Definition lmmp.h:171

引用了 lmmp_heap_allocator_t::free, global_heap , 以及 n.

◆ lmmp_temp_pool_alloc_()

static void * lmmp_temp_pool_alloc_ ( lmmp_alloc_marker pmarker,
size_t  size 
)
inlinestatic

在文件 tmp_alloc.h106 行定义.

106 {
110 if (remaining < 2 * offset) {
111 // 保证pool留有一个offset的空间,使得递归后子问题也尽可能分配到pool中,避免递归时子问题分配到堆上
113 } else {
114 mp_byte_t* new_top = p + offset;
117 if (pmarker->pool_marker == NULL)
118 pmarker->pool_marker = p;
119 return p;
120 }
121}
static void * lmmp_temp_heap_alloc_(lmmp_alloc_marker *pmarker, size_t size)
Definition tmp_alloc.h:41
_Thread_local lmmp_memory_ctx lmmp_tmpmem_ctx
Definition memory.c:41
void * pool_top
Definition tmp_alloc.h:27

引用了 LAMMP_MAX_ALIGN, LMMP_ROUND_UP_MULTIPLE, lmmp_temp_heap_alloc_(), lmmp_tmpmem_ctx, n, lmmp_memory_ctx::pool_top , 以及 lmmp_memory_ctx::remain.

+ 函数调用图:

◆ lmmp_temp_pool_free_()

static void lmmp_temp_pool_free_ ( lmmp_alloc_marker pmarker)
inlinestatic

在文件 tmp_alloc.h123 行定义.

123 {
124 // pmarker->pool_marker is not NULL
125 size_t freed = (mp_byte_t*)(lmmp_tmpmem_ctx.pool_top) - (mp_byte_t*)(pmarker->pool_marker);
127 lmmp_tmpmem_ctx.pool_top = pmarker->pool_marker;
128}

引用了 lmmp_tmpmem_ctx, n, lmmp_memory_ctx::pool_top , 以及 lmmp_memory_ctx::remain.

◆ lmmp_temp_stack_alloc_()

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

在文件 tmp_alloc.h76 行定义.

76 {
77 /*
78 * On the first call, pmarker->stack_marker is a null pointer.
79 * We will use pmarker->stack_marker to record the stack frame at this time.
80 * When allocating memory subsequently, we will not modify pmarker->stack_marker.
81 * Until all stack memory is finally released, we will move to the initial stack position at once,
82 * which is the position recorded by pmarker->stack_marker.
83 */
87#if LAMMP_DEBUG_STACK_OVERFLOW_CHECK == 1
89 char msg[128];
90 snprintf(msg, sizeof(msg), "Stack overflow (trying to allocate: %zu bytes, stack remaining: %zu bytes)", offset,
93 }
94#endif
96 if (pmarker->stack_marker == NULL)
97 pmarker->stack_marker = p;
98 return p;
99}
void * stack_top
Definition tmp_alloc.h:25
void * stack_end
Definition tmp_alloc.h:24

引用了 LAMMP_ERROR_MEMORY_ALLOC_FAILURE, LAMMP_MAX_ALIGN, lmmp_abort(), LMMP_ROUND_UP_MULTIPLE, lmmp_tmpmem_ctx, n, lmmp_memory_ctx::stack_end , 以及 lmmp_memory_ctx::stack_top.

+ 函数调用图:

◆ lmmp_temp_stack_free_()

static void lmmp_temp_stack_free_ ( lmmp_alloc_marker pmarker)
inlinestatic

在文件 tmp_alloc.h101 行定义.

101 {
102 // pmarker->stack_marker is not NULL
103 lmmp_tmpmem_ctx.stack_top = pmarker->stack_marker;
104}

引用了 lmmp_tmpmem_ctx, n , 以及 lmmp_memory_ctx::stack_top.

变量说明

◆ global_heap

在文件 memory.c29 行定义.

29 {
30 .alloc = (lmmp_heap_alloc_fn)malloc,
31 .free = (lmmp_heap_free_fn)free,
32 .realloc = (lmmp_realloc_fn)realloc,
33};
void(* lmmp_heap_free_fn)(void *ptr)
Definition lmmp.h:166
void *(* lmmp_realloc_fn)(void *ptr, size_t size)
Definition lmmp.h:167
void *(* lmmp_heap_alloc_fn)(size_t size)
Definition lmmp.h:165

被这些函数引用 lmmp_set_heap_allocator(), lmmp_temp_heap_alloc_() , 以及 lmmp_temp_heap_free_().

◆ lmmp_tmpmem_ctx

_Thread_local lmmp_memory_ctx lmmp_tmpmem_ctx
extern

在文件 memory.c41 行定义.

41 {
42 .stack_begin = NULL,
43 .stack_end = NULL,
44 .stack_top = NULL,
45 .pool_begin = NULL,
46 .pool_top = NULL,
47 .remain = 0,
48 .capacity = 0,
49};

被这些函数引用 lmmp_leak_tracker(), lmmp_stack_deinit(), lmmp_stack_init(), lmmp_temp_pool_alloc_(), lmmp_temp_pool_free_(), lmmp_temp_stack_alloc_() , 以及 lmmp_temp_stack_free_().