aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgingerBill <gingerBill@users.noreply.github.com>2026-02-02 12:04:21 +0000
committerGitHub <noreply@github.com>2026-02-02 12:04:21 +0000
commit80c948277455eb9deaf79ac910fdc8957038fb75 (patch)
treed95cb469a8dab31c15ea61b0f378066f3b7597eb /src
parent813b622dcc8ba6f7b330a310fc324fccb33a2264 (diff)
parenta936f3fb7d3f6e6abf5e2599b7043625a1a0c17b (diff)
Merge pull request #6217 from odin-lang/bill/threading-fixes-2026-02
Fix to frontend threading bugs
Diffstat (limited to 'src')
-rw-r--r--src/checker.cpp3
-rw-r--r--src/exact_value.cpp5
-rw-r--r--src/types.cpp10
3 files changed, 8 insertions, 10 deletions
diff --git a/src/checker.cpp b/src/checker.cpp
index 9568b8cfa..71ccfebc4 100644
--- a/src/checker.cpp
+++ b/src/checker.cpp
@@ -495,15 +495,18 @@ gb_internal Entity *scope_insert_with_name(Scope *s, String const &name, Entity
goto end;
}
if (s->parent != nullptr && (s->parent->flags & ScopeFlag_Proc) != 0) {
+ rw_mutex_shared_lock(&s->parent->mutex);
found = string_map_get(&s->parent->elements, key);
if (found) {
if ((*found)->flags & EntityFlag_Result) {
if (entity != *found) {
result = *found;
}
+ rw_mutex_shared_unlock(&s->parent->mutex);
goto end;
}
}
+ rw_mutex_shared_unlock(&s->parent->mutex);
}
string_map_set(&s->elements, key, entity);
diff --git a/src/exact_value.cpp b/src/exact_value.cpp
index 0f425e043..fa99ed3fe 100644
--- a/src/exact_value.cpp
+++ b/src/exact_value.cpp
@@ -1,8 +1,6 @@
#include <math.h>
#include <stdlib.h>
-gb_global BlockingMutex hash_exact_value_mutex;
-
struct Ast;
struct HashKey;
struct Type;
@@ -54,9 +52,6 @@ struct ExactValue {
gb_global ExactValue const empty_exact_value = {};
gb_internal uintptr hash_exact_value(ExactValue v) {
- mutex_lock(&hash_exact_value_mutex);
- defer (mutex_unlock(&hash_exact_value_mutex));
-
uintptr res = 0;
switch (v.kind) {
diff --git a/src/types.cpp b/src/types.cpp
index 9ecdf5cdd..0ecce1adc 100644
--- a/src/types.cpp
+++ b/src/types.cpp
@@ -4308,17 +4308,17 @@ gb_internal i64 *type_set_offsets_of(Slice<Entity *> const &fields, bool is_pack
gb_internal bool type_set_offsets(Type *t) {
t = base_type(t);
if (t->kind == Type_Struct) {
- if (t->Struct.are_offsets_being_processed.load()) {
- return true;
- }
+ // if (t->Struct.are_offsets_being_processed.load()) {
+ // return true;
+ // }
MUTEX_GUARD(&t->Struct.offset_mutex);
if (!t->Struct.are_offsets_set) {
t->Struct.are_offsets_being_processed.store(true);
t->Struct.offsets = type_set_offsets_of(t->Struct.fields, t->Struct.is_packed, t->Struct.is_raw_union, t->Struct.custom_min_field_align, t->Struct.custom_max_field_align);
t->Struct.are_offsets_being_processed.store(false);
t->Struct.are_offsets_set = true;
- return true;
}
+ return true;
} else if (is_type_tuple(t)) {
MUTEX_GUARD(&t->Tuple.mutex);
if (!t->Tuple.are_offsets_set) {
@@ -4326,8 +4326,8 @@ gb_internal bool type_set_offsets(Type *t) {
t->Tuple.offsets = type_set_offsets_of(t->Tuple.variables, t->Tuple.is_packed, false, 1, 0);
t->Tuple.are_offsets_being_processed.store(false);
t->Tuple.are_offsets_set = true;
- return true;
}
+ return true;
} else {
GB_PANIC("Invalid type for setting offsets");
}