UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
syms_default_arena.c
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#ifndef SYMS_DEFAULT_ARENA_C
4#define SYMS_DEFAULT_ARENA_C
5
9 SYMS_Arena *result = 0;
11 if (memory != 0){
12 if (syms_mem_commit(memory, cmt)){
13 result = (SYMS_Arena*)memory;
14 result->prev = 0;
15 result->current = result;
16 result->base_pos = 0;
17 result->pos = SYMS_ARENA_HEADER_SIZE;
18 result->cmt = cmt;
19 result->cap = res;
20 result->align = 8;
21 result->dev = 0;
22 }
23 else{
25 }
26 }
27 return(result);
28}
29
35
38 for (SYMS_DefArena *node = arena->current, *prev = 0;
39 node != 0;
40 node = prev){
41 prev = node->prev;
42 syms_mem_release(node, node->cap);
43 }
44}
45
46#define SYMS_ARENA_VERY_LARGE ((SYMS_ARENA_RESERVE_SIZE - SYMS_ARENA_HEADER_SIZE)/2) + 1
47
50 void *result = 0;
51
52 // get new pos
53 SYMS_Arena *current = arena->current;
54 SYMS_U64 pos_aligned = SYMS_AlignPow2(current->pos, arena->align);
56
57 // check cap
58 if (current->cap < pos_new){
59
60 // normal growth path
62 if (size < SYMS_ARENA_VERY_LARGE){
64 }
65 // "very large" growth path
66 else{
69 }
70
71 // connect block to chain
72 if (new_block != 0){
73 new_block->base_pos = current->base_pos + current->cap;
75
76 // recompute the new pos
77 current = new_block;
78 pos_aligned = SYMS_AlignPow2(current->pos, arena->align);
79 pos_new = pos_aligned + size;
80 }
81 }
82
83 // cap big enough?
84 if (current->cap >= pos_new){
85
86 // cmt too small?
87 if (current->cmt < pos_new){
88
89 // get new cmt
92 SYMS_U64 cmt_size = cmt_new - current->cmt;
93
94 // try commit
95 if (syms_mem_commit((SYMS_U8*)current + current->cmt, cmt_size)){
96 current->cmt = cmt_new;
97 }
98 }
99
100 // cmt big enough?
101 if (current->cmt >= pos_new){
102
103 // get result & advance pos
104 result = (SYMS_U8*)current + pos_aligned;
105 current->pos = pos_new;
106 }
107 }
108
109 SYMS_ASSERT(arena->current != 0);
110
111 // dev
112#if SYMS_ENABLE_DEV_ARENA
113 syms_arena_dev_push__impl(arena, size, result);
114#endif
115
116 return(result);
117}
118
121 SYMS_Arena *current = arena->current;
122 SYMS_U64 result = current->base_pos + current->pos;
123 return(result);
124}
125
129
130 // unroll the chain
131 SYMS_Arena *current = arena->current;
132 for (SYMS_Arena *prev = 0;
133 current->base_pos >= big_pos;
134 current = prev){
135 prev = current->prev;
136 syms_mem_release(current, current->cap);
137 }
138 arena->current = current;
139
140 // fix the pos
141 {
144 if (pos < current->pos){
145 current->pos = pos;
146 }
147 }
148
149 SYMS_ASSERT(arena->current != 0);
150
151 // dev
152#if SYMS_ENABLE_DEV_ARENA
154#endif
155}
156
161
164 // base adjustment
165 SYMS_DefArena *current = arena->current;
166 SYMS_U64 base_adjust = current->base_pos + current->cap;
167 for (SYMS_DefArena *node = sub->current;
168 node != 0;
169 node = node->prev){
170 node->base_pos += base_adjust;
171 }
172
173 // attach sub to arena
174 sub->prev = arena->current;
175 arena->current = sub->current;
176 sub->current = sub;
177
178 // dev
179#if SYMS_ENABLE_DEV_ARENA
181#endif
182}
183
184#endif //SYMS_DEFAULT_ARENA_C
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
int prev(int i, int n)
Definition RecastMesh.cpp:163
Definition syms_default_arena.h:42
SYMS_U64 align
Definition syms_default_arena.h:49
struct SYMS_DefArena * prev
Definition syms_default_arena.h:43
SYMS_U64 cap
Definition syms_default_arena.h:48
struct SYMS_DefArena * current
Definition syms_default_arena.h:44
SYMS_U64 base_pos
Definition syms_default_arena.h:45
#define SYMS_AlignPow2(a, b)
Definition syms_base.h:187
#define SYMS_StackPush_N(f, n, next)
Definition syms_base.h:224
#define SYMS_ClampTop(a, b)
Definition syms_base.h:182
#define SYMS_ClampBot(a, b)
Definition syms_base.h:183
#define SYMS_ASSERT(x)
Definition syms_base.h:125
#define SYMS_ARENA_RESERVE_SIZE
Definition syms_crt_overrides.h:83
uint64_t SYMS_U64
Definition syms_crt_overrides.h:39
#define syms_mem_release(p, s)
Definition syms_crt_overrides.h:76
#define SYMS_ARENA_COMMIT_SIZE
Definition syms_crt_overrides.h:84
#define SYMS_OVERRIDE_FUNC
Definition syms_crt_overrides.h:7
#define syms_mem_commit(p, s)
Definition syms_crt_overrides.h:74
#define syms_mem_reserve(s)
Definition syms_crt_overrides.h:73
uint8_t SYMS_U8
Definition syms_crt_overrides.h:36
SYMS_OVERRIDE_FUNC void syms_arena_def_absorb(SYMS_DefArena *arena, SYMS_DefArena *sub)
Definition syms_default_arena.c:163
SYMS_OVERRIDE_FUNC void syms_arena_def_set_auto_align(SYMS_DefArena *arena, SYMS_U64 pow2_align)
Definition syms_default_arena.c:158
SYMS_OVERRIDE_FUNC void syms_arena_def_pop_to(SYMS_DefArena *arena, SYMS_U64 pos_unclamped)
Definition syms_default_arena.c:127
SYMS_OVERRIDE_FUNC SYMS_DefArena * syms_arena_def_alloc(void)
Definition syms_default_arena.c:31
SYMS_OVERRIDE_FUNC SYMS_DefArena * syms_arena_def_alloc__sized(SYMS_U64 res, SYMS_U64 cmt)
Definition syms_default_arena.c:7
SYMS_OVERRIDE_FUNC SYMS_U64 syms_arena_def_pos(SYMS_Arena *arena)
Definition syms_default_arena.c:120
#define SYMS_ARENA_VERY_LARGE
Definition syms_default_arena.c:46
SYMS_OVERRIDE_FUNC void * syms_arena_def_push(SYMS_DefArena *arena, SYMS_U64 size)
Definition syms_default_arena.c:49
SYMS_OVERRIDE_FUNC void syms_arena_def_release(SYMS_DefArena *arena)
Definition syms_default_arena.c:37
#define SYMS_ARENA_HEADER_SIZE
Definition syms_default_arena.h:29
#define SYMS_Arena
Definition syms_default_arena.h:61