aboutsummaryrefslogtreecommitdiff
path: root/src/common_memory.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/common_memory.cpp')
-rw-r--r--src/common_memory.cpp60
1 files changed, 37 insertions, 23 deletions
diff --git a/src/common_memory.cpp b/src/common_memory.cpp
index d772eb795..ebdb0e4a7 100644
--- a/src/common_memory.cpp
+++ b/src/common_memory.cpp
@@ -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()