From e97bf2ef358eef4499dfee0dc1533bf785d923f2 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 12 Jan 2023 15:38:23 +0000 Subject: [PATCH] Minimize contention on the deps for decls --- src/check_decl.cpp | 5 ++++- src/check_expr.cpp | 3 +++ src/checker.cpp | 7 +++++++ src/checker.hpp | 4 ++++ 4 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/check_decl.cpp b/src/check_decl.cpp index f0059424e..e28861fc6 100644 --- a/src/check_decl.cpp +++ b/src/check_decl.cpp @@ -1608,7 +1608,10 @@ gb_internal bool check_proc_body(CheckerContext *ctx_, Token token, DeclInfo *de check_scope_usage(ctx->checker, ctx->scope); - add_deps_from_child_to_parent(decl); + if (decl->entity == nullptr) { + // Only care about nested procedure literals + add_deps_from_child_to_parent(decl); + } return true; } diff --git a/src/check_expr.cpp b/src/check_expr.cpp index c1fa21dc4..52efd9a66 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -9455,6 +9455,9 @@ gb_internal ExprKind check_expr_base_internal(CheckerContext *c, Operand *o, Ast pl->decl = decl; check_procedure_later(ctx.checker, ctx.file, empty_token, decl, type, pl->body, pl->tags); + mutex_lock(&ctx.checker->nested_proc_lits_mutex); + array_add(&ctx.checker->nested_proc_lits, decl); + mutex_unlock(&ctx.checker->nested_proc_lits_mutex); } check_close_scope(&ctx); diff --git a/src/checker.cpp b/src/checker.cpp index 6d73348d1..7be3c71d1 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -1256,6 +1256,7 @@ gb_internal void init_checker(Checker *c) { // NOTE(bill): 1 Mi elements should be enough on average array_init(&c->procs_to_check, heap_allocator(), 0, 1<<20); + array_init(&c->nested_proc_lits, heap_allocator(), 0, 1<<20); mpsc_init(&c->global_untyped_queue, a); // , 1<<20); @@ -1267,6 +1268,7 @@ gb_internal void destroy_checker(Checker *c) { destroy_checker_context(&c->builtin_ctx); + array_free(&c->nested_proc_lits); array_free(&c->procs_to_check); mpsc_destroy(&c->global_untyped_queue); } @@ -5657,6 +5659,11 @@ gb_internal void check_walk_all_dependencies(DeclInfo *decl) { } gb_internal void check_update_dependency_tree_for_procedures(Checker *c) { + mutex_lock(&c->nested_proc_lits_mutex); + for (DeclInfo *decl : c->nested_proc_lits) { + check_walk_all_dependencies(decl); + } + mutex_unlock(&c->nested_proc_lits_mutex); for (Entity *e : c->info.entities) { DeclInfo *decl = e->decl_info; check_walk_all_dependencies(decl); diff --git a/src/checker.hpp b/src/checker.hpp index 595618e1d..d461b1f6e 100644 --- a/src/checker.hpp +++ b/src/checker.hpp @@ -449,6 +449,10 @@ struct Checker { MPSCQueue procs_with_deferred_to_check; Array procs_to_check; + BlockingMutex nested_proc_lits_mutex; + Array nested_proc_lits; + + MPSCQueue global_untyped_queue; };