mirror of
https://github.com/Ed94/Odin.git
synced 2026-06-26 23:44:58 -07:00
Correct arena_temp_end usage when no allocation ever happens for that arena
This commit is contained in:
@@ -1050,7 +1050,6 @@ gb_internal bool has_asm_extension(String const &path) {
|
||||
|
||||
// temporary
|
||||
gb_internal char *token_pos_to_string(TokenPos const &pos) {
|
||||
TEMPORARY_ALLOCATOR_GUARD();
|
||||
gbString s = gb_string_make_reserve(temporary_allocator(), 128);
|
||||
String file = get_file_path_string(pos.file_id);
|
||||
switch (build_context.ODIN_ERROR_POS_STYLE) {
|
||||
|
||||
+1
-3
@@ -2375,7 +2375,7 @@ gb_internal void check_comparison(CheckerContext *c, Operand *x, Operand *y, Tok
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
TEMPORARY_ALLOCATOR_GUARD();
|
||||
gbString err_str = nullptr;
|
||||
|
||||
if (check_is_assignable_to(c, x, y->type) ||
|
||||
@@ -2405,7 +2405,6 @@ gb_internal void check_comparison(CheckerContext *c, Operand *x, Operand *y, Tok
|
||||
if (x->type == err_type && is_operand_nil(*x)) {
|
||||
err_type = y->type;
|
||||
}
|
||||
TEMPORARY_ALLOCATOR_GUARD();
|
||||
gbString type_string = type_to_string(err_type, temporary_allocator());
|
||||
err_str = gb_string_make(temporary_allocator(),
|
||||
gb_bprintf("operator '%.*s' not defined for type '%s'", LIT(token_strings[op]), type_string));
|
||||
@@ -2418,7 +2417,6 @@ gb_internal void check_comparison(CheckerContext *c, Operand *x, Operand *y, Tok
|
||||
add_comparison_procedures_for_fields(c, comparison_type);
|
||||
}
|
||||
} else {
|
||||
TEMPORARY_ALLOCATOR_GUARD();
|
||||
gbString xt, yt;
|
||||
if (x->mode == Addressing_ProcGroup) {
|
||||
xt = gb_string_make(temporary_allocator(), "procedure group");
|
||||
|
||||
+499
-490
File diff suppressed because it is too large
Load Diff
+37
-23
@@ -271,35 +271,47 @@ void arena_temp_end(ArenaTemp const &temp) {
|
||||
Arena *arena = temp.arena;
|
||||
MUTEX_GUARD(&arena->mutex);
|
||||
|
||||
bool memory_block_found = false;
|
||||
for (MemoryBlock *block = arena->curr_block; block != nullptr; block = block->prev) {
|
||||
if (block == temp.block) {
|
||||
memory_block_found = true;
|
||||
break;
|
||||
if (temp.block) {
|
||||
bool memory_block_found = false;
|
||||
for (MemoryBlock *block = arena->curr_block; block != nullptr; block = block->prev) {
|
||||
if (block == temp.block) {
|
||||
memory_block_found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
GB_ASSERT_MSG(memory_block_found, "memory block stored within ArenaTemp not owned by Arena");
|
||||
GB_ASSERT_MSG(memory_block_found, "memory block stored within ArenaTemp not owned by Arena");
|
||||
|
||||
while (arena->curr_block != temp.block) {
|
||||
MemoryBlock *free_block = arena->curr_block;
|
||||
if (free_block != nullptr) {
|
||||
arena->curr_block = free_block->prev;
|
||||
virtual_memory_dealloc(free_block);
|
||||
while (arena->curr_block != temp.block) {
|
||||
MemoryBlock *free_block = arena->curr_block;
|
||||
if (free_block != nullptr) {
|
||||
arena->curr_block = free_block->prev;
|
||||
virtual_memory_dealloc(free_block);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
MemoryBlock *block = arena->curr_block;
|
||||
if (block) {
|
||||
GB_ASSERT_MSG(block->used >= temp.used, "out of order use of arena_temp_end");
|
||||
isize amount_to_zero = gb_min(block->used - temp.used, block->size - block->used);
|
||||
gb_zero_size(block->base + temp.used, amount_to_zero);
|
||||
block->used = temp.used;
|
||||
MemoryBlock *block = arena->curr_block;
|
||||
if (block) {
|
||||
GB_ASSERT_MSG(block->used >= temp.used, "out of order use of arena_temp_end");
|
||||
isize amount_to_zero = gb_min(block->used - temp.used, block->size - block->used);
|
||||
gb_zero_size(block->base + temp.used, amount_to_zero);
|
||||
block->used = temp.used;
|
||||
}
|
||||
}
|
||||
|
||||
GB_ASSERT_MSG(arena->temp_count > 0, "double-use of arena_temp_end");
|
||||
arena->temp_count -= 1;
|
||||
}
|
||||
|
||||
void arena_temp_ignore(ArenaTemp const &temp) {
|
||||
GB_ASSERT(temp.arena);
|
||||
Arena *arena = temp.arena;
|
||||
MUTEX_GUARD(&arena->mutex);
|
||||
|
||||
GB_ASSERT_MSG(arena->temp_count > 0, "double-use of arena_temp_end");
|
||||
arena->temp_count -= 1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
struct ArenaTempGuard {
|
||||
ArenaTempGuard(Arena *arena) {
|
||||
@@ -363,11 +375,13 @@ gb_internal gbAllocator temporary_allocator() {
|
||||
return arena_allocator(&temporary_arena);
|
||||
}
|
||||
|
||||
#define TEMPORARY_ALLOCATOR_GUARD()
|
||||
#define PERMANENT_ALLOCATOR_GUARD()
|
||||
|
||||
// #define TEMPORARY_ALLOCATOR_GUARD() ArenaTempGuard GB_DEFER_3(_arena_guard_){&temporary_arena}
|
||||
// #define PERMANENT_ALLOCATOR_GUARD() ArenaTempGuard GB_DEFER_3(_arena_guard_){&permanent_arena}
|
||||
#define TEMP_ARENA_GUARD(arena) ArenaTempGuard GB_DEFER_3(_arena_guard_){arena}
|
||||
|
||||
|
||||
// #define TEMPORARY_ALLOCATOR_GUARD()
|
||||
#define TEMPORARY_ALLOCATOR_GUARD() TEMP_ARENA_GUARD(&temporary_arena)
|
||||
#define PERMANENT_ALLOCATOR_GUARD()
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user