aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2023-01-16 18:05:58 +0000
committergingerBill <bill@gingerbill.org>2023-01-16 18:05:58 +0000
commit65c0255e7ef82fe45fbc5e55a2c642e96b81343a (patch)
tree2d7f332022f6c4211e686ebdc656a623edc679ea /src
parentb289a27c4eb26f0e2984c0cbb1a9a7e07cc40325 (diff)
Replace `RecursiveMutex` with a `BlockingMutex`
Diffstat (limited to 'src')
-rw-r--r--src/llvm_backend.hpp2
-rw-r--r--src/llvm_backend_debug.cpp5
-rw-r--r--src/llvm_backend_general.cpp20
3 files changed, 14 insertions, 13 deletions
diff --git a/src/llvm_backend.hpp b/src/llvm_backend.hpp
index beb9a99b6..8237b880f 100644
--- a/src/llvm_backend.hpp
+++ b/src/llvm_backend.hpp
@@ -143,7 +143,7 @@ struct lbModule {
PtrMap<void *, lbStructFieldRemapping> struct_field_remapping; // Key: LLVMTypeRef or Type *
i32 internal_type_level;
- RecursiveMutex values_mutex;
+ BlockingMutex values_mutex;
PtrMap<Entity *, lbValue> values;
PtrMap<Entity *, lbAddr> soa_values;
diff --git a/src/llvm_backend_debug.cpp b/src/llvm_backend_debug.cpp
index 83f6da04e..fc9e63274 100644
--- a/src/llvm_backend_debug.cpp
+++ b/src/llvm_backend_debug.cpp
@@ -495,15 +495,14 @@ gb_internal LLVMMetadataRef lb_get_base_scope_metadata(lbModule *m, Scope *scope
}
gb_internal LLVMMetadataRef lb_debug_type(lbModule *m, Type *type) {
- mutex_lock(&m->debug_values_mutex);
- defer (mutex_unlock(&m->debug_values_mutex));
-
GB_ASSERT(type != nullptr);
LLVMMetadataRef found = lb_get_llvm_metadata(m, type);
if (found != nullptr) {
return found;
}
+ MUTEX_GUARD(&m->debug_values_mutex);
+
if (type->kind == Type_Named) {
LLVMMetadataRef file = nullptr;
unsigned line = 0;
diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp
index 7846c302a..5bee5d32c 100644
--- a/src/llvm_backend_general.cpp
+++ b/src/llvm_backend_general.cpp
@@ -2547,11 +2547,14 @@ gb_internal lbValue lb_find_ident(lbProcedure *p, lbModule *m, Entity *e, Ast *e
return *found;
}
}
+
+ lbValue *found = nullptr;
mutex_lock(&m->values_mutex);
- defer (mutex_unlock(&m->values_mutex));
+ found = map_get(&m->values, e);
+ mutex_unlock(&m->values_mutex);
- auto *found = map_get(&m->values, e);
if (found) {
+
auto v = *found;
// NOTE(bill): This is because pointers are already pointers in LLVM
if (is_type_proc(v.type)) {
@@ -2598,10 +2601,10 @@ gb_internal lbValue lb_find_procedure_value_from_entity(lbModule *m, Entity *e)
e = strip_entity_wrapping(e);
GB_ASSERT(e != nullptr);
+ lbValue *found = nullptr;
mutex_lock(&m->values_mutex);
- defer (mutex_unlock(&m->values_mutex));
-
- auto *found = map_get(&m->values, e);
+ found = map_get(&m->values, e);
+ mutex_unlock(&m->values_mutex);
if (found) {
return *found;
}
@@ -2698,11 +2701,10 @@ gb_internal lbValue lb_find_value_from_entity(lbModule *m, Entity *e) {
return lb_find_procedure_value_from_entity(m, e);
}
+ lbValue *found = nullptr;
mutex_lock(&m->values_mutex);
- defer (mutex_unlock(&m->values_mutex));
-
-
- auto *found = map_get(&m->values, e);
+ found = map_get(&m->values, e);
+ mutex_unlock(&m->values_mutex);
if (found) {
return *found;
}