From 6bd3a9d422d0567ead89e2465f46068d52f34f20 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 2 Jan 2023 22:23:49 +0000 Subject: [PATCH] Be very explicit where the gen_procs_mutex can be unlock --- src/check_expr.cpp | 39 +++++++++++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index f47361c27..b40c48459 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -436,14 +436,19 @@ gb_internal bool find_or_generate_polymorphic_procedure(CheckerContext *old_c, E GenProcsData *found_gen_procs = nullptr; - MUTEX_GUARD(&info->gen_procs_mutex); + // @@GPM + mutex_lock(&info->gen_procs_mutex); found_gen_procs = map_get(&info->gen_procs, base_entity->identifier.load()); + if (found_gen_procs) { MUTEX_GUARD(&found_gen_procs->mutex); for (Entity *other : found_gen_procs->procs) { Type *pt = base_type(other->type); if (are_types_identical(pt, final_proc_type)) { + // @@GPM + mutex_unlock(&info->gen_procs_mutex); + if (poly_proc_data) { poly_proc_data->gen_entity = other; } @@ -465,6 +470,8 @@ gb_internal bool find_or_generate_polymorphic_procedure(CheckerContext *old_c, E Ast *cloned_proc_type_node = clone_ast(pt->node); success = check_procedure_type(&nctx, final_proc_type, cloned_proc_type_node, &operands); if (!success) { + // @@GPM + mutex_unlock(&info->gen_procs_mutex); return false; } @@ -473,6 +480,9 @@ gb_internal bool find_or_generate_polymorphic_procedure(CheckerContext *old_c, E for (Entity *other : found_gen_procs->procs) { Type *pt = base_type(other->type); if (are_types_identical(pt, final_proc_type)) { + // @@GPM + mutex_unlock(&info->gen_procs_mutex); + if (poly_proc_data) { poly_proc_data->gen_entity = other; } @@ -498,6 +508,11 @@ gb_internal bool find_or_generate_polymorphic_procedure(CheckerContext *old_c, E } } + if (found_gen_procs) { + // @@GPM + mutex_unlock(&info->gen_procs_mutex); + } + Ast *proc_lit = clone_ast(old_decl->proc_lit); ast_node(pl, ProcLit, proc_lit); @@ -555,6 +570,19 @@ gb_internal bool find_or_generate_polymorphic_procedure(CheckerContext *old_c, E } } + if (found_gen_procs) { + MUTEX_GUARD(&found_gen_procs->mutex); + array_add(&found_gen_procs->procs, entity); + } else { + GenProcsData gen_proc_data = {}; + gen_proc_data.procs = array_make(heap_allocator()); + array_add(&gen_proc_data.procs, entity); + map_set(&info->gen_procs, base_entity->identifier.load(), gen_proc_data); + + // @@GPM + mutex_unlock(&info->gen_procs_mutex); + } + ProcInfo *proc_info = gb_alloc_item(permanent_allocator(), ProcInfo); proc_info->file = file; proc_info->token = token; @@ -565,15 +593,6 @@ gb_internal bool find_or_generate_polymorphic_procedure(CheckerContext *old_c, E proc_info->generated_from_polymorphic = true; proc_info->poly_def_node = poly_def_node; - if (found_gen_procs) { - MUTEX_GUARD(&found_gen_procs->mutex); - array_add(&found_gen_procs->procs, entity); - } else { - GenProcsData gen_proc_data = {}; - gen_proc_data.procs = array_make(heap_allocator()); - array_add(&gen_proc_data.procs, entity); - map_set(&info->gen_procs, base_entity->identifier.load(), gen_proc_data); - } if (poly_proc_data) { poly_proc_data->gen_entity = entity;