diff --git a/src/base/base_arena.c b/src/base/base_arena.c index 0d9300e2..22778571 100644 --- a/src/base/base_arena.c +++ b/src/base/base_arena.c @@ -62,7 +62,6 @@ arena_alloc_(ArenaParams *params) arena->allocation_site_file = params->allocation_site_file; arena->allocation_site_line = params->allocation_site_line; #if ARENA_FREE_LIST - arena->free_size = 0; arena->free_last = 0; #endif AsanPoisonMemoryRegion(base, commit_size); @@ -95,22 +94,22 @@ arena_push(Arena *arena, U64 size, U64 align, B32 zero) Arena *new_block = 0; #if ARENA_FREE_LIST - Arena *prev_block; - for(new_block = arena->free_last, prev_block = 0; new_block != 0; prev_block = new_block, new_block = new_block->prev) { - if(new_block->res >= AlignPow2(size, align)) + Arena *prev_block; + for(new_block = arena->free_last, prev_block = 0; new_block != 0; prev_block = new_block, new_block = new_block->prev) { - if(prev_block) + if(new_block->res >= AlignPow2(new_block->pos, align) + size) { - prev_block->prev = new_block->prev; + if(prev_block) + { + prev_block->prev = new_block->prev; + } + else + { + arena->free_last = new_block->prev; + } + break; } - else - { - arena->free_last = new_block->prev; - } - arena->free_size -= new_block->res_size; - AsanUnpoisonMemoryRegion((U8*)new_block + ARENA_HEADER_SIZE, new_block->res_size - ARENA_HEADER_SIZE); - break; } } #endif @@ -209,9 +208,8 @@ arena_pop_to(Arena *arena, U64 pos) { prev = current->prev; current->pos = ARENA_HEADER_SIZE; - arena->free_size += current->res_size; SLLStackPush_N(arena->free_last, current, prev); - AsanPoisonMemoryRegion((U8*)current + ARENA_HEADER_SIZE, current->res_size - ARENA_HEADER_SIZE); + AsanPoisonMemoryRegion((U8*)current + ARENA_HEADER_SIZE, current->res - ARENA_HEADER_SIZE); } #else for(Arena *prev = 0; current->base_pos >= big_pos; current = prev) diff --git a/src/base/base_arena.h b/src/base/base_arena.h index 589d67bf..99fd33bb 100644 --- a/src/base/base_arena.h +++ b/src/base/base_arena.h @@ -42,7 +42,6 @@ struct Arena char *allocation_site_file; int allocation_site_line; #if ARENA_FREE_LIST - U64 free_size; Arena *free_last; #endif };