diff options
| author | gingerBill <bill@gingerbill.org> | 2021-08-18 11:17:14 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2021-08-18 11:17:14 +0100 |
| commit | a01c946c207ccfabd3636c8db8c54fd08f5f54f9 (patch) | |
| tree | 4b4533686c56148c75bd2c4191fb7a682bbe57be /src/checker.cpp | |
| parent | 84b0da44dbdc5fb02f3d480b6627291bf69e1d74 (diff) | |
Add mutex to Scope lookups and insertions
Diffstat (limited to 'src/checker.cpp')
| -rw-r--r-- | src/checker.cpp | 69 |
1 files changed, 39 insertions, 30 deletions
diff --git a/src/checker.cpp b/src/checker.cpp index c8c3d8e9c..f121bf9cc 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -227,6 +227,7 @@ Scope *create_scope(CheckerInfo *info, Scope *parent, isize init_elements_capaci s->parent = parent; string_map_init(&s->elements, heap_allocator(), init_elements_capacity); ptr_set_init(&s->imported, heap_allocator(), 0); + mutex_init(&s->mutex); if (parent != nullptr && parent != builtin_pkg->scope) { Scope *prev_head_child = parent->head_child.exchange(s, std::memory_order_acq_rel); @@ -307,6 +308,7 @@ void destroy_scope(Scope *scope) { string_map_destroy(&scope->elements); ptr_set_destroy(&scope->imported); + mutex_destroy(&scope->mutex); // NOTE(bill): No need to free scope as it "should" be allocated in an arena (except for the global scope) } @@ -356,43 +358,46 @@ Entity *scope_lookup_current(Scope *s, String const &name) { } void scope_lookup_parent(Scope *scope, String const &name, Scope **scope_, Entity **entity_) { - bool gone_thru_proc = false; - bool gone_thru_package = false; - StringHashKey key = string_hash_string(name); - for (Scope *s = scope; s != nullptr; s = s->parent) { - Entity **found = string_map_get(&s->elements, key); - if (found) { - Entity *e = *found; - if (gone_thru_proc) { - // IMPORTANT TODO(bill): Is this correct?! - if (e->kind == Entity_Label) { - continue; - } - if (e->kind == Entity_Variable) { - if (e->scope->flags&ScopeFlag_File) { - // Global variables are file to access - } else if (e->flags&EntityFlag_Static) { - // Allow static/thread_local variables to be referenced - } else { + if (scope != nullptr) { + bool gone_thru_proc = false; + bool gone_thru_package = false; + StringHashKey key = string_hash_string(name); + for (Scope *s = scope; s != nullptr; s = s->parent) { + Entity **found = nullptr; + mutex_lock(&s->mutex); + found = string_map_get(&s->elements, key); + mutex_unlock(&s->mutex); + if (found) { + Entity *e = *found; + if (gone_thru_proc) { + // IMPORTANT TODO(bill): Is this correct?! + if (e->kind == Entity_Label) { continue; } + if (e->kind == Entity_Variable) { + if (e->scope->flags&ScopeFlag_File) { + // Global variables are file to access + } else if (e->flags&EntityFlag_Static) { + // Allow static/thread_local variables to be referenced + } else { + continue; + } + } } - } - if (entity_) *entity_ = e; - if (scope_) *scope_ = s; - return; - } + if (entity_) *entity_ = e; + if (scope_) *scope_ = s; + return; + } - if (s->flags&ScopeFlag_Proc) { - gone_thru_proc = true; - } - if (s->flags&ScopeFlag_Pkg) { - gone_thru_package = true; + if (s->flags&ScopeFlag_Proc) { + gone_thru_proc = true; + } + if (s->flags&ScopeFlag_Pkg) { + gone_thru_package = true; + } } } - - if (entity_) *entity_ = nullptr; if (scope_) *scope_ = nullptr; } @@ -410,6 +415,10 @@ Entity *scope_insert_with_name(Scope *s, String const &name, Entity *entity) { return nullptr; } StringHashKey key = string_hash_string(name); + + mutex_lock(&s->mutex); + defer (mutex_unlock(&s->mutex)); + Entity **found = string_map_get(&s->elements, key); if (found) { |