From da79124e5d43c54a358fd18b64414ec2c1536476 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 26 Aug 2021 23:10:15 +0100 Subject: [PATCH] Use local mutex for each `AstFile.arena` --- src/common_memory.cpp | 22 +++++++++++++++++----- src/parser.cpp | 3 ++- src/tokenizer.cpp | 3 +-- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/common_memory.cpp b/src/common_memory.cpp index ffdc9118a..dfc86b5f3 100644 --- a/src/common_memory.cpp +++ b/src/common_memory.cpp @@ -59,6 +59,8 @@ struct MemoryBlock { struct Arena { MemoryBlock * curr_block; isize minimum_block_size; + bool use_local_mutex; + BlockingMutex local_mutex; }; enum { DEFAULT_MINIMUM_BLOCK_SIZE = 8ll*1024ll*1024ll }; @@ -79,15 +81,25 @@ isize arena_align_forward_offset(Arena *arena, isize alignment) { return alignment_offset; } +void arena_init_local_mutex(Arena *arena) { + mutex_init(&arena->local_mutex); + arena->use_local_mutex = true; +} + + void *arena_alloc(Arena *arena, isize min_size, isize alignment) { GB_ASSERT(gb_is_power_of_two(alignment)); - isize size = 0; - - // TODO(bill): make it so that this can be done lock free (if possible) - mutex_lock(&global_memory_allocator_mutex); + BlockingMutex *mutex = &global_memory_allocator_mutex; + if (arena->use_local_mutex) { + mutex = &arena->local_mutex; + } + + mutex_lock(mutex); + + isize size = 0; if (arena->curr_block != nullptr) { size = min_size + arena_align_forward_offset(arena, alignment); } @@ -112,7 +124,7 @@ void *arena_alloc(Arena *arena, isize min_size, isize alignment) { curr_block->used += size; GB_ASSERT(curr_block->used <= curr_block->size); - mutex_unlock(&global_memory_allocator_mutex); + mutex_unlock(mutex); // NOTE(bill): memory will be zeroed by default due to virtual memory return ptr; diff --git a/src/parser.cpp b/src/parser.cpp index d8f3a9e33..f77179ea7 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -4786,6 +4786,7 @@ ParseFileError init_ast_file(AstFile *f, String fullpath, TokenPos *err_pos) { block_size = ((block_size + page_size-1)/page_size) * page_size; block_size = gb_clamp(block_size, page_size, DEFAULT_MINIMUM_BLOCK_SIZE); f->arena.minimum_block_size = block_size; + arena_init_local_mutex(&f->arena); array_init(&f->comments, heap_allocator(), 0, 0); @@ -5539,7 +5540,7 @@ ParseFileError process_imported_file(Parser *p, ImportedFile imported_file) { FileInfo fi = imported_file.fi; TokenPos pos = imported_file.pos; - AstFile *file = gb_alloc_item(heap_allocator(), AstFile); + AstFile *file = gb_alloc_item(permanent_allocator(), AstFile); file->pkg = pkg; file->id = cast(i32)(imported_file.index+1); TokenPos err_pos = {0}; diff --git a/src/tokenizer.cpp b/src/tokenizer.cpp index 556da7c4c..814e418aa 100644 --- a/src/tokenizer.cpp +++ b/src/tokenizer.cpp @@ -805,8 +805,7 @@ void init_tokenizer_with_data(Tokenizer *t, String const &fullpath, void *data, TokenizerInitError init_tokenizer_from_fullpath(Tokenizer *t, String const &fullpath, TokenizerFlags flags = TokenizerFlag_None) { TokenizerInitError err = TokenizerInit_None; - char *c_str = alloc_cstring(heap_allocator(), fullpath); - defer (gb_free(heap_allocator(), c_str)); + char *c_str = alloc_cstring(temporary_allocator(), fullpath); // TODO(bill): Memory map rather than copy contents gbFileContents fc = gb_file_read_contents(heap_allocator(), true, c_str);