aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2023-01-03 15:34:52 +0000
committergingerBill <bill@gingerbill.org>2023-01-03 15:34:52 +0000
commit3dee3205b299b2a2e803a3bc248f0a9ffdcce69e (patch)
tree80db08306f6fe3b632cdea11d59ef7887095fc8e /src
parentc7a704d345e9bda38da18807a1d7cd5bc5accc17 (diff)
Use `RwMutex` for `DeclInfo` `deps
Diffstat (limited to 'src')
-rw-r--r--src/check_decl.cpp27
-rw-r--r--src/check_expr.cpp6
-rw-r--r--src/checker.cpp8
-rw-r--r--src/checker.hpp4
4 files changed, 27 insertions, 18 deletions
diff --git a/src/check_decl.cpp b/src/check_decl.cpp
index 4afde6e51..72c69b5dc 100644
--- a/src/check_decl.cpp
+++ b/src/check_decl.cpp
@@ -1584,19 +1584,26 @@ gb_internal bool check_proc_body(CheckerContext *ctx_, Token token, DeclInfo *de
// NOTE(bill): Add the dependencies from the procedure literal (lambda)
// But only at the procedure level
- MUTEX_GUARD_BLOCK(decl->deps_mutex)
- MUTEX_GUARD_BLOCK(decl->parent->deps_mutex) {
- for (Entity *e : decl->deps) {
- ptr_set_add(&decl->parent->deps, e);
- }
+ rw_mutex_shared_lock(&decl->deps_mutex);
+ rw_mutex_lock(&decl->parent->deps_mutex);
+
+ for (Entity *e : decl->deps) {
+ ptr_set_add(&decl->parent->deps, e);
}
- MUTEX_GUARD_BLOCK(decl->type_info_deps_mutex)
- MUTEX_GUARD_BLOCK(decl->parent->type_info_deps_mutex) {
- for (Type *t : decl->type_info_deps) {
- ptr_set_add(&decl->parent->type_info_deps, t);
- }
+ rw_mutex_unlock(&decl->parent->deps_mutex);
+ rw_mutex_shared_unlock(&decl->deps_mutex);
+
+
+ rw_mutex_shared_lock(&decl->type_info_deps_mutex);
+ rw_mutex_lock(&decl->parent->type_info_deps_mutex);
+
+ for (Type *t : decl->type_info_deps) {
+ ptr_set_add(&decl->parent->type_info_deps, t);
}
+
+ rw_mutex_unlock(&decl->parent->type_info_deps_mutex);
+ rw_mutex_shared_unlock(&decl->type_info_deps_mutex);
}
}
diff --git a/src/check_expr.cpp b/src/check_expr.cpp
index d9ab328cb..e3cd66db6 100644
--- a/src/check_expr.cpp
+++ b/src/check_expr.cpp
@@ -4928,21 +4928,23 @@ gb_internal bool check_identifier_exists(Scope *s, Ast *node, bool nested = fals
gb_internal isize add_dependencies_from_unpacking(CheckerContext *c, Entity **lhs, isize lhs_count, isize tuple_index, isize tuple_count) {
if (lhs != nullptr && c->decl != nullptr) {
- mutex_lock(&c->info->deps_mutex);
+ // mutex_lock(&c->info->deps_mutex);
for (isize j = 0; (tuple_index + j) < lhs_count && j < tuple_count; j++) {
Entity *e = lhs[tuple_index + j];
if (e != nullptr) {
DeclInfo *decl = decl_info_of_entity(e);
if (decl != nullptr) {
+ rw_mutex_lock(&c->decl->deps_mutex);
for (Entity *dep : decl->deps) {
ptr_set_add(&c->decl->deps, dep);
}
+ rw_mutex_unlock(&c->decl->deps_mutex);
}
}
}
- mutex_unlock(&c->info->deps_mutex);
+ // mutex_unlock(&c->info->deps_mutex);
}
return tuple_count;
}
diff --git a/src/checker.cpp b/src/checker.cpp
index 1d536074d..fd80d07de 100644
--- a/src/checker.cpp
+++ b/src/checker.cpp
@@ -744,17 +744,17 @@ gb_internal void check_scope_usage(Checker *c, Scope *scope) {
gb_internal void add_dependency(CheckerInfo *info, DeclInfo *d, Entity *e) {
- mutex_lock(&d->deps_mutex);
+ rw_mutex_lock(&d->deps_mutex);
ptr_set_add(&d->deps, e);
- mutex_unlock(&d->deps_mutex);
+ rw_mutex_unlock(&d->deps_mutex);
}
gb_internal void add_type_info_dependency(CheckerInfo *info, DeclInfo *d, Type *type) {
if (d == nullptr) {
return;
}
- mutex_lock(&d->type_info_deps_mutex);
+ rw_mutex_lock(&d->type_info_deps_mutex);
ptr_set_add(&d->type_info_deps, type);
- mutex_unlock(&d->type_info_deps_mutex);
+ rw_mutex_unlock(&d->type_info_deps_mutex);
}
gb_internal AstPackage *get_core_package(CheckerInfo *info, String name) {
diff --git a/src/checker.hpp b/src/checker.hpp
index 53052d5cd..50f4a204c 100644
--- a/src/checker.hpp
+++ b/src/checker.hpp
@@ -179,10 +179,10 @@ struct DeclInfo {
CommentGroup *comment;
CommentGroup *docs;
- BlockingMutex deps_mutex;
+ RwMutex deps_mutex;
PtrSet<Entity *> deps;
- BlockingMutex type_info_deps_mutex;
+ RwMutex type_info_deps_mutex;
PtrSet<Type *> type_info_deps;
Array<BlockLabel> labels;