aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2021-08-26 23:10:15 +0100
committergingerBill <bill@gingerbill.org>2021-08-26 23:10:15 +0100
commitda79124e5d43c54a358fd18b64414ec2c1536476 (patch)
treecdf5d0379fb49cd209c903b4e17282c2bf8050e8 /src
parent2f34f1283a067335d5738abe15997e6af5e3a600 (diff)
Use local mutex for each `AstFile.arena`
Diffstat (limited to 'src')
-rw-r--r--src/common_memory.cpp20
-rw-r--r--src/parser.cpp3
-rw-r--r--src/tokenizer.cpp3
3 files changed, 19 insertions, 7 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;
+
+ BlockingMutex *mutex = &global_memory_allocator_mutex;
+ if (arena->use_local_mutex) {
+ mutex = &arena->local_mutex;
+ }
- // TODO(bill): make it so that this can be done lock free (if possible)
- mutex_lock(&global_memory_allocator_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);