diff --git a/ets2panda/checker/ETSchecker.cpp b/ets2panda/checker/ETSchecker.cpp index d5290ab601f9156a87ba0d3224b95f8fc1a351b1..0c802616908f7e074d431d4c55bf0b280bfe0336 100644 --- a/ets2panda/checker/ETSchecker.cpp +++ b/ets2panda/checker/ETSchecker.cpp @@ -76,8 +76,11 @@ void ETSChecker::ReputCheckerData() auto &globalArraySigs = eChecker->globalArraySignatures_; globalArraySignatures_.insert(globalArraySigs.cbegin(), globalArraySigs.cend()); - auto &apparentTypes = eChecker->apparentTypes_; - apparentTypes_.insert(apparentTypes.cbegin(), apparentTypes.cend()); + { + os::memory::LockHolder lock(apparentTypesLock_); + auto &apparentTypes = eChecker->apparentTypes_; + apparentTypes_.insert(apparentTypes.cbegin(), apparentTypes.cend()); + } auto &objectInstantiationMap = eChecker->objectInstantiationMap_; for (auto &[key, value] : objectInstantiationMap) { diff --git a/ets2panda/checker/ETSchecker.h b/ets2panda/checker/ETSchecker.h index d27cf96faa3f0628ccc6b076f3179333d1f937c9..e43d5783f101b42633baf0c531c19b79af5ecbf7 100644 --- a/ets2panda/checker/ETSchecker.h +++ b/ets2panda/checker/ETSchecker.h @@ -28,6 +28,7 @@ #include "ir/visitor/AstVisitor.h" #include "types/type.h" #include "util/helpers.h" +#include "os/mutex.h" namespace ark::es2panda::varbinder { class VarBinder; @@ -941,6 +942,7 @@ public: void ClearApparentTypes() noexcept { + os::memory::LockHolder lock(apparentTypesLock_); apparentTypes_.clear(); } @@ -962,7 +964,7 @@ public: } dynamicLambdaSignatureCache_.clear(); functionalInterfaceCache_.clear(); - apparentTypes_.clear(); + ClearApparentTypes(); for (auto &dynamicCallNamesMap : dynamicCallNames_) { dynamicCallNamesMap.clear(); } @@ -1117,6 +1119,7 @@ private: DynamicLambdaObjectSignatureMap dynamicLambdaSignatureCache_; FunctionalInterfaceMap functionalInterfaceCache_; TypeMapping apparentTypes_; + ark::os::memory::RecursiveMutex apparentTypesLock_; std::array dynamicCallNames_; std::recursive_mutex mtx_; evaluate::ScopedDebugInfoPlugin *debugInfoPlugin_ {nullptr}; diff --git a/ets2panda/checker/ets/object.cpp b/ets2panda/checker/ets/object.cpp index e88dc37f377a4878c695a4bb06ad6d332d445cbb..2205d5435444078a941b39c9c197072c14bbcfcc 100644 --- a/ets2panda/checker/ets/object.cpp +++ b/ets2panda/checker/ets/object.cpp @@ -2615,11 +2615,10 @@ Type *ETSChecker::GetApparentType(Type *type) { auto currChecker = compiler::GetPhaseManager()->Context()->GetChecker()->AsETSChecker(); auto &apparentTypes = currChecker->apparentTypes_; - + os::memory::LockHolder lock(apparentTypesLock_); if (auto it = apparentTypes.find(type); LIKELY(it != apparentTypes.end())) { return it->second; } - auto cached = [&apparentTypes, type](Type *res) { if (type != res) { apparentTypes.insert({type, res}); diff --git a/ets2panda/checker/types/typeRelation.h b/ets2panda/checker/types/typeRelation.h index 33c32e789cfada5d83580cd839f5aacf80fa48e5..e77e6c93d4802f42c3f0b731d4636c34e7b8686e 100644 --- a/ets2panda/checker/types/typeRelation.h +++ b/ets2panda/checker/types/typeRelation.h @@ -105,6 +105,7 @@ public: const RelationEntry *Find(RelationKey key) const { + ark::os::memory::ReadLockHolder lock(rwLock_); auto it = cached_.find(key); if (it == cached_.cend()) { return nullptr; @@ -114,16 +115,19 @@ public: void Insert(RelationKey key, RelationEntry entry) { + ark::os::memory::WriteLockHolder lock(rwLock_); cached_.insert({key, entry}); } void Clear() { + ark::os::memory::WriteLockHolder lock(rwLock_); cached_.clear(); } private: ArenaUnorderedMap cached_; + mutable ark::os::memory::RWLock rwLock_; }; class TypeRelation { diff --git a/ets2panda/compiler/lowering/phase.cpp b/ets2panda/compiler/lowering/phase.cpp index 4dd62cd22f43e0431bce0cac6462659346fa8501..165a79f1b8e1dea8f15b6434cc7a774b95b383cd 100644 --- a/ets2panda/compiler/lowering/phase.cpp +++ b/ets2panda/compiler/lowering/phase.cpp @@ -202,7 +202,7 @@ std::vector GetJSPhaseList() }; } -thread_local PhaseManager *g_phaseManager {nullptr}; +PhaseManager *g_phaseManager {nullptr}; PhaseManager *GetPhaseManager() {