diff options
| author | gingerBill <bill@gingerbill.org> | 2021-07-10 15:14:25 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2021-07-10 15:14:25 +0100 |
| commit | 9f7154a03941f1ffad629e8e558040911e9886ba (patch) | |
| tree | 6caea41c1fa95b592e630b2f007099ae0b46f2cc /src/check_expr.cpp | |
| parent | 4a932616fc6d8d5c4cad98debf292a1916e5a2be (diff) | |
Prepare for multithreading the semantic checker by giving mutexes to variables of contention
NOTE(bill): I know this is dodgy, but I want to make sure it is correct logic before improve those data structures
Diffstat (limited to 'src/check_expr.cpp')
| -rw-r--r-- | src/check_expr.cpp | 39 |
1 files changed, 24 insertions, 15 deletions
diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 4d2cd56d4..9399f94dc 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -48,8 +48,8 @@ struct CallArgumentData { }; struct PolyProcData { - Entity * gen_entity; - ProcInfo proc_info; + Entity * gen_entity; + ProcInfo *proc_info; }; struct ValidIndexAndScore { @@ -279,7 +279,7 @@ bool find_or_generate_polymorphic_procedure(CheckerContext *c, Entity *base_enti }); - + CheckerInfo *info = c->info; CheckerContext nctx = *c; Scope *scope = create_scope(base_entity->scope); @@ -294,7 +294,6 @@ bool find_or_generate_polymorphic_procedure(CheckerContext *c, Entity *base_enti } - auto *pt = &src->Proc; // NOTE(bill): This is slightly memory leaking if the type already exists @@ -306,8 +305,13 @@ bool find_or_generate_polymorphic_procedure(CheckerContext *c, Entity *base_enti return false; } - auto *found_gen_procs = map_get(&nctx.info->gen_procs, hash_pointer(base_entity->identifier)); + gb_mutex_lock(&info->gen_procs_mutex); + auto *found_gen_procs = map_get(&info->gen_procs, hash_pointer(base_entity->identifier)); + gb_mutex_unlock(&info->gen_procs_mutex); if (found_gen_procs) { + gb_mutex_lock(&info->gen_procs_mutex); + defer (gb_mutex_unlock(&info->gen_procs_mutex)); + auto procs = *found_gen_procs; for_array(i, procs) { Entity *other = procs[i]; @@ -344,6 +348,9 @@ bool find_or_generate_polymorphic_procedure(CheckerContext *c, Entity *base_enti } if (found_gen_procs) { + gb_mutex_lock(&info->gen_procs_mutex); + defer (gb_mutex_unlock(&info->gen_procs_mutex)); + auto procs = *found_gen_procs; for_array(i, procs) { Entity *other = procs[i]; @@ -403,23 +410,25 @@ bool find_or_generate_polymorphic_procedure(CheckerContext *c, Entity *base_enti } } - ProcInfo proc_info = {}; - proc_info.file = file; - proc_info.token = token; - proc_info.decl = d; - proc_info.type = final_proc_type; - proc_info.body = pl->body; - proc_info.tags = tags; - proc_info.generated_from_polymorphic = true; - proc_info.poly_def_node = poly_def_node; + ProcInfo *proc_info = gb_alloc_item(permanent_allocator(), ProcInfo); + proc_info->file = file; + proc_info->token = token; + proc_info->decl = d; + proc_info->type = final_proc_type; + proc_info->body = pl->body; + proc_info->tags = tags; + proc_info->generated_from_polymorphic = true; + proc_info->poly_def_node = poly_def_node; + gb_mutex_lock(&info->gen_procs_mutex); if (found_gen_procs) { array_add(found_gen_procs, entity); } else { auto array = array_make<Entity *>(heap_allocator()); array_add(&array, entity); - map_set(&nctx.checker->info.gen_procs, hash_pointer(base_entity->identifier), array); + map_set(&info->gen_procs, hash_pointer(base_entity->identifier), array); } + gb_mutex_unlock(&info->gen_procs_mutex); GB_ASSERT(entity != nullptr); |