aboutsummaryrefslogtreecommitdiff
path: root/src/parser.cpp
diff options
context:
space:
mode:
authorgingerBill <gingerBill@users.noreply.github.com>2025-09-10 20:51:52 +0100
committergingerBill <gingerBill@users.noreply.github.com>2025-09-10 20:51:52 +0100
commit34e3d3078057fdf22c2f91847096e0a3e098fa82 (patch)
treeea60a45338b92bb5b3523e11dd5984142175ec4d /src/parser.cpp
parent0476d33a6c3b0c730b0e0defc10b571b1037c14c (diff)
More thread contention removal
Diffstat (limited to 'src/parser.cpp')
-rw-r--r--src/parser.cpp10
1 files changed, 9 insertions, 1 deletions
diff --git a/src/parser.cpp b/src/parser.cpp
index a05e183ce..a7006dd39 100644
--- a/src/parser.cpp
+++ b/src/parser.cpp
@@ -1,5 +1,7 @@
#include "parser_pos.cpp"
+gb_global std::atomic<bool> g_parsing_done;
+
gb_internal bool in_vet_packages(AstFile *file) {
if (file == nullptr) {
return true;
@@ -176,7 +178,11 @@ gb_internal Ast *clone_ast(Ast *node, AstFile *f) {
return nullptr;
}
if (f == nullptr) {
- f = node->thread_safe_file();
+ if (g_parsing_done.load(std::memory_order_relaxed)) {
+ f = node->file();
+ } else {
+ f = node->thread_safe_file();
+ }
}
Ast *n = alloc_ast_node(f, node->kind);
gb_memmove(n, node, ast_node_size(node->kind));
@@ -6924,6 +6930,8 @@ gb_internal ParseFileError parse_packages(Parser *p, String init_filename) {
}
}
+ g_parsing_done.store(true, std::memory_order_relaxed);
+
return ParseFile_None;
}