aboutsummaryrefslogtreecommitdiff
path: root/src/checker.cpp
diff options
context:
space:
mode:
authorgingerBill <gingerBill@users.noreply.github.com>2025-09-10 12:42:36 +0100
committergingerBill <gingerBill@users.noreply.github.com>2025-09-10 12:42:36 +0100
commit629777b988da50ab347b6309ac07821acfd1ee59 (patch)
tree09c6db68a175cb6fab6cf80a3a71c4aeec9c8675 /src/checker.cpp
parent1d561247f51ccd95154d137dc5ccfa9a45d512d8 (diff)
Multithread `check_update_dependency_tree_for_procedures`
Diffstat (limited to 'src/checker.cpp')
-rw-r--r--src/checker.cpp39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/checker.cpp b/src/checker.cpp
index e5dda2aa7..c43175230 100644
--- a/src/checker.cpp
+++ b/src/checker.cpp
@@ -7025,6 +7025,7 @@ gb_internal void add_type_info_for_type_definitions(Checker *c) {
}
}
+#if 0
gb_internal void check_walk_all_dependencies(DeclInfo *decl) {
if (decl == nullptr) {
return;
@@ -7046,6 +7047,44 @@ gb_internal void check_update_dependency_tree_for_procedures(Checker *c) {
check_walk_all_dependencies(decl);
}
}
+#else
+gb_internal void check_walk_all_dependencies(DeclInfo *decl);
+
+gb_internal WORKER_TASK_PROC(check_walk_all_dependencies_worker_proc) {
+ if (data == nullptr) {
+ return 0;
+ }
+ DeclInfo *decl = cast(DeclInfo *)data;
+
+ for (DeclInfo *child = decl->next_child; child != nullptr; child = child->next_sibling) {
+ thread_pool_add_task(check_walk_all_dependencies_worker_proc, child);
+ check_walk_all_dependencies(child);
+ }
+
+ add_deps_from_child_to_parent(decl);
+ return 0;
+}
+
+gb_internal void check_walk_all_dependencies(DeclInfo *decl) {
+ if (decl != nullptr) {
+ thread_pool_add_task(check_walk_all_dependencies_worker_proc, 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);
+ }
+
+ thread_pool_wait();
+}
+#endif
gb_internal void check_parsed_files(Checker *c) {