From ecf65303cd1e608a3f3bb6bc0f7b521c742b40cf Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 28 Feb 2023 12:37:05 +0000 Subject: [PATCH] Make `arena_free_all` keep the first memory block for a `.Growing` arena --- core/mem/virtual/arena.odin | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/core/mem/virtual/arena.odin b/core/mem/virtual/arena.odin index f93138d07..579490489 100644 --- a/core/mem/virtual/arena.odin +++ b/core/mem/virtual/arena.odin @@ -143,6 +143,9 @@ arena_static_reset_to :: proc(arena: ^Arena, pos: uint, loc := #caller_location) arena_growing_free_last_memory_block :: proc(arena: ^Arena, loc := #caller_location) { if free_block := arena.curr_block; free_block != nil { assert(arena.kind == .Growing, "expected a .Growing arena", loc) + arena.total_used -= free_block.used + arena.total_reserved -= free_block.reserved + arena.curr_block = free_block.prev memory_block_dealloc(free_block) } @@ -152,22 +155,30 @@ arena_free_all :: proc(arena: ^Arena, loc := #caller_location) { switch arena.kind { case .Growing: sync.mutex_guard(&arena.mutex) - for arena.curr_block != nil { + // NOTE(bill): Free all but the first memory block (if it exists) + for arena.curr_block != nil && arena.curr_block.prev != nil { arena_growing_free_last_memory_block(arena, loc) } - arena.total_reserved = 0 + // Zero the first block's memory + if arena.curr_block != nil { + mem.zero(arena.curr_block.base, int(arena.curr_block.used)) + arena.curr_block.used = 0 + } + arena.total_used = 0 case .Static, .Buffer: arena_static_reset_to(arena, 0) } arena.total_used = 0 } -arena_destroy :: proc(arena: ^Arena) { - arena_free_all(arena) +arena_destroy :: proc(arena: ^Arena, loc := #caller_location) { + sync.mutex_guard(&arena.mutex) if arena.kind != .Buffer { - memory_block_dealloc(arena.curr_block) + for arena.curr_block != nil { + arena_growing_free_last_memory_block(arena, loc) + } } - arena.curr_block = nil + arena.curr_block = nil arena.total_used = 0 arena.total_reserved = 0 arena.temp_count = 0