From 1154cb0c2ddb6ab5ce9d3184b05c56bde24f25d1 Mon Sep 17 00:00:00 2001 From: wanmingxiang Date: Tue, 22 Jul 2025 20:25:47 +0800 Subject: [PATCH 1/5] fix contension issues 4 GenAsm --- ets2panda/checker/ETSchecker.cpp | 7 +++++-- ets2panda/checker/ETSchecker.h | 5 ++++- ets2panda/checker/ets/object.cpp | 9 +++++++-- ets2panda/compiler/core/codeGen.cpp | 10 ++++++---- ets2panda/compiler/core/codeGen.h | 4 +++- 5 files changed, 25 insertions(+), 10 deletions(-) diff --git a/ets2panda/checker/ETSchecker.cpp b/ets2panda/checker/ETSchecker.cpp index d5290ab601..b29c7f082f 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()); + { + ark::os::memory::WriteLockHolder 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 d27cf96faa..7be3f58553 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 { + ark::os::memory::WriteLockHolder 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_; + mutable ark::os::memory::RWLock 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 e88dc37f37..081008b264 100644 --- a/ets2panda/checker/ets/object.cpp +++ b/ets2panda/checker/ets/object.cpp @@ -2615,11 +2615,16 @@ Type *ETSChecker::GetApparentType(Type *type) { auto currChecker = compiler::GetPhaseManager()->Context()->GetChecker()->AsETSChecker(); auto &apparentTypes = currChecker->apparentTypes_; - + { + ark::os::memory::ReadLockHolder lock(apparentTypesLock_); + if (auto it = apparentTypes.find(type); LIKELY(it != apparentTypes.end())) { + return it->second; + } + } + ark::os::memory::WriteLockHolder 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/compiler/core/codeGen.cpp b/ets2panda/compiler/core/codeGen.cpp index fd01a1c9f2..2f17c0af28 100644 --- a/ets2panda/compiler/core/codeGen.cpp +++ b/ets2panda/compiler/core/codeGen.cpp @@ -98,11 +98,13 @@ VReg CodeGen::AllocRegWithType(const checker::Type *const type) void CodeGen::SetVRegType(const VReg vreg, const checker::Type *const type) { + ark::os::memory::WriteLockHolder lock(typeMapMutex_); typeMap_.insert_or_assign(vreg, type); } const checker::Type *CodeGen::GetVRegType(const VReg vreg) const { + ark::os::memory::ReadLockHolder lock(typeMapMutex_); const auto it = typeMap_.find(vreg); return it != typeMap_.end() ? it->second : nullptr; } @@ -340,10 +342,10 @@ ProgramElement *CodeGen::ProgElement() const noexcept return programElement_; } -CodeGen::TypeMap &CodeGen::GetTypeMap() noexcept -{ - return typeMap_; -} +// CodeGen::TypeMap &CodeGen::GetTypeMap() noexcept +// { +// return typeMap_; +// } const CodeGen::TypeMap &CodeGen::GetTypeMap() const noexcept { diff --git a/ets2panda/compiler/core/codeGen.h b/ets2panda/compiler/core/codeGen.h index 8fbeeb0106..404c9c955e 100644 --- a/ets2panda/compiler/core/codeGen.h +++ b/ets2panda/compiler/core/codeGen.h @@ -20,6 +20,7 @@ #include "compiler/core/ASTCompiler.h" #include "compiler/core/regAllocator.h" #include "compiler/core/regScope.h" +#include "os/mutex.h" namespace ark::es2panda::compiler { class CatchTable; class DynamicContext; @@ -162,7 +163,7 @@ protected: [[nodiscard]] RangeRegAllocator &Rra() noexcept; [[nodiscard]] const RangeRegAllocator &Rra() const noexcept; [[nodiscard]] ProgramElement *ProgElement() const noexcept; - [[nodiscard]] TypeMap &GetTypeMap() noexcept; +// [[nodiscard]] TypeMap &GetTypeMap() noexcept; [[nodiscard]] const TypeMap &GetTypeMap() const noexcept; private: @@ -176,6 +177,7 @@ private: ArenaVector insns_; ArenaVector catchList_; TypeMap typeMap_; + mutable ark::os::memory::RWLock typeMapMutex_; ProgramElement *programElement_ {}; DynamicContext *dynamicContext_ {}; -- Gitee From f3f758fd1adbedc00db77ddada147a7e2cb73a16 Mon Sep 17 00:00:00 2001 From: wanmingxiang Date: Tue, 22 Jul 2025 21:57:37 +0800 Subject: [PATCH 2/5] fix dl in recursive call stack --- ets2panda/checker/ETSchecker.cpp | 2 +- ets2panda/checker/ETSchecker.h | 4 ++-- ets2panda/checker/ets/object.cpp | 8 +------- 3 files changed, 4 insertions(+), 10 deletions(-) diff --git a/ets2panda/checker/ETSchecker.cpp b/ets2panda/checker/ETSchecker.cpp index b29c7f082f..d144eb531f 100644 --- a/ets2panda/checker/ETSchecker.cpp +++ b/ets2panda/checker/ETSchecker.cpp @@ -77,7 +77,7 @@ void ETSChecker::ReputCheckerData() globalArraySignatures_.insert(globalArraySigs.cbegin(), globalArraySigs.cend()); { - ark::os::memory::WriteLockHolder lock(apparentTypesLock_); + std::unique_lock lock(apparentTypesLock_); auto &apparentTypes = eChecker->apparentTypes_; apparentTypes_.insert(apparentTypes.cbegin(), apparentTypes.cend()); } diff --git a/ets2panda/checker/ETSchecker.h b/ets2panda/checker/ETSchecker.h index 7be3f58553..05346df46b 100644 --- a/ets2panda/checker/ETSchecker.h +++ b/ets2panda/checker/ETSchecker.h @@ -942,7 +942,7 @@ public: void ClearApparentTypes() noexcept { - ark::os::memory::WriteLockHolder lock(apparentTypesLock_); + std::unique_lock lock(apparentTypesLock_); apparentTypes_.clear(); } @@ -1119,7 +1119,7 @@ private: DynamicLambdaObjectSignatureMap dynamicLambdaSignatureCache_; FunctionalInterfaceMap functionalInterfaceCache_; TypeMapping apparentTypes_; - mutable ark::os::memory::RWLock apparentTypesLock_; + std::recursive_mutex 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 081008b264..a61bf56148 100644 --- a/ets2panda/checker/ets/object.cpp +++ b/ets2panda/checker/ets/object.cpp @@ -2615,13 +2615,7 @@ Type *ETSChecker::GetApparentType(Type *type) { auto currChecker = compiler::GetPhaseManager()->Context()->GetChecker()->AsETSChecker(); auto &apparentTypes = currChecker->apparentTypes_; - { - ark::os::memory::ReadLockHolder lock(apparentTypesLock_); - if (auto it = apparentTypes.find(type); LIKELY(it != apparentTypes.end())) { - return it->second; - } - } - ark::os::memory::WriteLockHolder lock(apparentTypesLock_); + std::unique_lock lock(currChecker->apparentTypesLock_); if (auto it = apparentTypes.find(type); LIKELY(it != apparentTypes.end())) { return it->second; } -- Gitee From 1b3d94dab543413007dc8a00baddaf0999057829 Mon Sep 17 00:00:00 2001 From: wanmingxiang Date: Wed, 23 Jul 2025 09:11:48 +0800 Subject: [PATCH 3/5] relation map --- ets2panda/checker/types/typeRelation.h | 4 ++++ ets2panda/compiler/lowering/phase.cpp | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/ets2panda/checker/types/typeRelation.h b/ets2panda/checker/types/typeRelation.h index 33c32e789c..e77e6c93d4 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 4dd62cd22f..165a79f1b8 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() { -- Gitee From 97f1056768390451906b67a72d058a7a26c6718a Mon Sep 17 00:00:00 2001 From: wanmingxiang Date: Wed, 23 Jul 2025 15:26:00 +0800 Subject: [PATCH 4/5] rm lock in codeGen --- ets2panda/compiler/core/codeGen.cpp | 10 ++++------ ets2panda/compiler/core/codeGen.h | 4 +--- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/ets2panda/compiler/core/codeGen.cpp b/ets2panda/compiler/core/codeGen.cpp index 2f17c0af28..fd01a1c9f2 100644 --- a/ets2panda/compiler/core/codeGen.cpp +++ b/ets2panda/compiler/core/codeGen.cpp @@ -98,13 +98,11 @@ VReg CodeGen::AllocRegWithType(const checker::Type *const type) void CodeGen::SetVRegType(const VReg vreg, const checker::Type *const type) { - ark::os::memory::WriteLockHolder lock(typeMapMutex_); typeMap_.insert_or_assign(vreg, type); } const checker::Type *CodeGen::GetVRegType(const VReg vreg) const { - ark::os::memory::ReadLockHolder lock(typeMapMutex_); const auto it = typeMap_.find(vreg); return it != typeMap_.end() ? it->second : nullptr; } @@ -342,10 +340,10 @@ ProgramElement *CodeGen::ProgElement() const noexcept return programElement_; } -// CodeGen::TypeMap &CodeGen::GetTypeMap() noexcept -// { -// return typeMap_; -// } +CodeGen::TypeMap &CodeGen::GetTypeMap() noexcept +{ + return typeMap_; +} const CodeGen::TypeMap &CodeGen::GetTypeMap() const noexcept { diff --git a/ets2panda/compiler/core/codeGen.h b/ets2panda/compiler/core/codeGen.h index 404c9c955e..8fbeeb0106 100644 --- a/ets2panda/compiler/core/codeGen.h +++ b/ets2panda/compiler/core/codeGen.h @@ -20,7 +20,6 @@ #include "compiler/core/ASTCompiler.h" #include "compiler/core/regAllocator.h" #include "compiler/core/regScope.h" -#include "os/mutex.h" namespace ark::es2panda::compiler { class CatchTable; class DynamicContext; @@ -163,7 +162,7 @@ protected: [[nodiscard]] RangeRegAllocator &Rra() noexcept; [[nodiscard]] const RangeRegAllocator &Rra() const noexcept; [[nodiscard]] ProgramElement *ProgElement() const noexcept; -// [[nodiscard]] TypeMap &GetTypeMap() noexcept; + [[nodiscard]] TypeMap &GetTypeMap() noexcept; [[nodiscard]] const TypeMap &GetTypeMap() const noexcept; private: @@ -177,7 +176,6 @@ private: ArenaVector insns_; ArenaVector catchList_; TypeMap typeMap_; - mutable ark::os::memory::RWLock typeMapMutex_; ProgramElement *programElement_ {}; DynamicContext *dynamicContext_ {}; -- Gitee From a510c62e5080760de674236ac044b8af0e14f3b6 Mon Sep 17 00:00:00 2001 From: wanmingxiang Date: Wed, 23 Jul 2025 15:51:35 +0800 Subject: [PATCH 5/5] replace recursive lock from pandabase --- ets2panda/checker/ETSchecker.cpp | 2 +- ets2panda/checker/ETSchecker.h | 4 ++-- ets2panda/checker/ets/object.cpp | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ets2panda/checker/ETSchecker.cpp b/ets2panda/checker/ETSchecker.cpp index d144eb531f..0c80261690 100644 --- a/ets2panda/checker/ETSchecker.cpp +++ b/ets2panda/checker/ETSchecker.cpp @@ -77,7 +77,7 @@ void ETSChecker::ReputCheckerData() globalArraySignatures_.insert(globalArraySigs.cbegin(), globalArraySigs.cend()); { - std::unique_lock lock(apparentTypesLock_); + os::memory::LockHolder lock(apparentTypesLock_); auto &apparentTypes = eChecker->apparentTypes_; apparentTypes_.insert(apparentTypes.cbegin(), apparentTypes.cend()); } diff --git a/ets2panda/checker/ETSchecker.h b/ets2panda/checker/ETSchecker.h index 05346df46b..e43d5783f1 100644 --- a/ets2panda/checker/ETSchecker.h +++ b/ets2panda/checker/ETSchecker.h @@ -942,7 +942,7 @@ public: void ClearApparentTypes() noexcept { - std::unique_lock lock(apparentTypesLock_); + os::memory::LockHolder lock(apparentTypesLock_); apparentTypes_.clear(); } @@ -1119,7 +1119,7 @@ private: DynamicLambdaObjectSignatureMap dynamicLambdaSignatureCache_; FunctionalInterfaceMap functionalInterfaceCache_; TypeMapping apparentTypes_; - std::recursive_mutex apparentTypesLock_; + 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 a61bf56148..2205d54354 100644 --- a/ets2panda/checker/ets/object.cpp +++ b/ets2panda/checker/ets/object.cpp @@ -2615,7 +2615,7 @@ Type *ETSChecker::GetApparentType(Type *type) { auto currChecker = compiler::GetPhaseManager()->Context()->GetChecker()->AsETSChecker(); auto &apparentTypes = currChecker->apparentTypes_; - std::unique_lock lock(currChecker->apparentTypesLock_); + os::memory::LockHolder lock(apparentTypesLock_); if (auto it = apparentTypes.find(type); LIKELY(it != apparentTypes.end())) { return it->second; } -- Gitee