aboutsummaryrefslogtreecommitdiff
path: root/src/types.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2024-06-06 23:55:48 +0100
committergingerBill <bill@gingerbill.org>2024-06-06 23:55:48 +0100
commit7044a7d77650e922a66f3bfe99711f3ed370e1ba (patch)
treec31f6413c08b69f6598dbe406c6cb1e5efec2642 /src/types.cpp
parent08612423b9afffb7499d8db2c69715df1627bd50 (diff)
Try to fix a possible race condition with polymorphic record parameters
Diffstat (limited to 'src/types.cpp')
-rw-r--r--src/types.cpp18
1 files changed, 18 insertions, 0 deletions
diff --git a/src/types.cpp b/src/types.cpp
index 45aa26894..4ceba5244 100644
--- a/src/types.cpp
+++ b/src/types.cpp
@@ -140,6 +140,7 @@ struct TypeStruct {
i64 custom_field_align;
Type * polymorphic_params; // Type_Tuple
Type * polymorphic_parent;
+ Wait_Signal polymorphic_wait_signal;
Type * soa_elem;
i32 soa_count;
@@ -167,6 +168,7 @@ struct TypeUnion {
i64 custom_align;
Type * polymorphic_params; // Type_Tuple
Type * polymorphic_parent;
+ Wait_Signal polymorphic_wait_signal;
i16 tag_size;
bool is_polymorphic;
@@ -1093,6 +1095,7 @@ gb_internal Type *alloc_type_struct() {
gb_internal Type *alloc_type_struct_complete() {
Type *t = alloc_type(Type_Struct);
wait_signal_set(&t->Struct.fields_wait_signal);
+ wait_signal_set(&t->Struct.polymorphic_wait_signal);
return t;
}
@@ -2136,15 +2139,30 @@ gb_internal bool is_type_polymorphic_record_unspecialized(Type *t) {
return false;
}
+gb_internal void wait_for_record_polymorphic_params(Type *t) {
+ t = base_type(t);
+ switch (t->kind) {
+ case Type_Struct:
+ wait_signal_until_available(&t->Struct.polymorphic_wait_signal);
+ break;
+ case Type_Union:
+ wait_signal_until_available(&t->Union.polymorphic_wait_signal);
+ break;
+ }
+}
+
+
gb_internal TypeTuple *get_record_polymorphic_params(Type *t) {
t = base_type(t);
switch (t->kind) {
case Type_Struct:
+ wait_signal_until_available(&t->Struct.polymorphic_wait_signal);
if (t->Struct.polymorphic_params) {
return &t->Struct.polymorphic_params->Tuple;
}
break;
case Type_Union:
+ wait_signal_until_available(&t->Union.polymorphic_wait_signal);
if (t->Union.polymorphic_params) {
return &t->Union.polymorphic_params->Tuple;
}