diff --git a/frameworks/native/appkit/ability_delegator/ability_delegator_registry.cpp b/frameworks/native/appkit/ability_delegator/ability_delegator_registry.cpp index bfdc3298b9acaca3b9adde777785904821b8e810..490eb1d0579563254726e2ee8d7e82d55759b4ea 100644 --- a/frameworks/native/appkit/ability_delegator/ability_delegator_registry.cpp +++ b/frameworks/native/appkit/ability_delegator/ability_delegator_registry.cpp @@ -24,10 +24,13 @@ std::shared_ptr AbilityDelegatorRegistry::abilityDelegator std::shared_ptr AbilityDelegatorRegistry::GetAbilityDelegator( const AbilityRuntime::Runtime::Language &language) { + std::lock_guard lock(delegatorMapMutex_); auto it = abilityDelegator_.find(language); if (it != abilityDelegator_.end()) { - auto p = reinterpret_cast(it->second.get()); - return std::shared_ptr(it->second, p); + auto p = static_cast(it->second.get()); + if (!p) { + return std::shared_ptr(it->second, p); + } } return nullptr; } @@ -35,10 +38,13 @@ std::shared_ptr AbilityDelegatorRegistry::GetAbilityDelegator( #ifdef CJ_FRONTEND std::shared_ptr AbilityDelegatorRegistry::GetCJAbilityDelegator() { + std::lock_guard lock(delegatorMapMutex_); auto it = abilityDelegator_.find(AbilityRuntime::Runtime::Language::CJ); if (it != abilityDelegator_.end()) { - auto p = reinterpret_cast(it->second.get()); - return std::shared_ptr(it->second, p); + auto p = static_cast(it->second.get()); + if (!p) { + return std::shared_ptr(it->second, p); + } } return nullptr; } @@ -46,13 +52,18 @@ std::shared_ptr AbilityDelegatorRegistry::GetCJAbilityDe std::shared_ptr AbilityDelegatorRegistry::GetArguments() { + std::lock_guard lock(delegatorArgsMutex_); return abilityDelegatorArgs_; } void AbilityDelegatorRegistry::RegisterInstance(const std::shared_ptr &delegator, const std::shared_ptr &args, const AbilityRuntime::Runtime::Language &language) { - abilityDelegatorArgs_ = args; + { + std::lock_guard lock(delegatorArgsMutex_); + abilityDelegatorArgs_ = args; + } + std::lock_guard lock(delegatorMapMutex_); abilityDelegator_.insert_or_assign(language, delegator); } } // namespace AppExecFwk diff --git a/interfaces/kits/native/appkit/ability_delegator/ability_delegator_registry.h b/interfaces/kits/native/appkit/ability_delegator/ability_delegator_registry.h index 57f9c383be7d8d3bf41457d9cfe902ea43a2a0f5..973ad02022f8f363a12056cab3d75c42953b3aa5 100644 --- a/interfaces/kits/native/appkit/ability_delegator/ability_delegator_registry.h +++ b/interfaces/kits/native/appkit/ability_delegator/ability_delegator_registry.h @@ -68,6 +68,8 @@ public: private: static std::map> abilityDelegator_; static std::shared_ptr abilityDelegatorArgs_; + static std::mutex delegatorMapMutex_; + static std::mutex delegatorArgsMutex_; }; } // namespace AppExecFwk } // namespace OHOS