diff options
| author | gingerBill <bill@gingerbill.org> | 2021-08-16 15:33:26 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2021-08-16 15:33:26 +0100 |
| commit | 94d298755a6036c3dbbf95aed3299e021c3fb9c8 (patch) | |
| tree | e286061f5150d083616e64886fcef267fc03866f /src/checker.cpp | |
| parent | 5f072591ba70abf6df59f4ed9372649e7ebda710 (diff) | |
Fix race condition when adding a dependency
Diffstat (limited to 'src/checker.cpp')
| -rw-r--r-- | src/checker.cpp | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/src/checker.cpp b/src/checker.cpp index 79a60f896..11d706403 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -629,14 +629,16 @@ void check_scope_usage(Checker *c, Scope *scope) { } -void add_dependency(DeclInfo *d, Entity *e) { +void add_dependency(CheckerInfo *info, DeclInfo *d, Entity *e) { + mutex_lock(&info->deps_mutex); ptr_set_add(&d->deps, e); + mutex_unlock(&info->deps_mutex); } void add_type_info_dependency(DeclInfo *d, Type *type) { if (d == nullptr) { - // GB_ASSERT(type == t_invalid); return; } + // NOTE(bill): no mutex is required here because the only procedure calling it is wrapped in a mutex already ptr_set_add(&d->type_info_deps, type); } @@ -657,7 +659,7 @@ void add_package_dependency(CheckerContext *c, char const *package_name, char co e->flags |= EntityFlag_Used; GB_ASSERT_MSG(e != nullptr, "%s", name); GB_ASSERT(c->decl != nullptr); - ptr_set_add(&c->decl->deps, e); + add_dependency(c->info, c->decl, e); } void add_declaration_dependency(CheckerContext *c, Entity *e) { @@ -665,7 +667,7 @@ void add_declaration_dependency(CheckerContext *c, Entity *e) { return; } if (c->decl != nullptr) { - add_dependency(c->decl, e); + add_dependency(c->info, c->decl, e); } } |