diff --git a/frameworks/core/common/ace_engine.cpp b/frameworks/core/common/ace_engine.cpp index 96b084ef6afacb274bd742352e342668c20d6b53..b4f2e6bc7d062f195c3aa8e93fe8079a4d5d6444 100644 --- a/frameworks/core/common/ace_engine.cpp +++ b/frameworks/core/common/ace_engine.cpp @@ -51,9 +51,10 @@ void HandleSignal(int signo) } } - +std::atomic AceEngine::isAlive_ = false; AceEngine::AceEngine() { + isAlive_.store(true); if (!SystemProperties::GetHookModeEnabled()) { watchDog_ = AceType::MakeRefPtr(); } @@ -62,6 +63,7 @@ AceEngine::AceEngine() AceEngine::~AceEngine() { LOGI("~AceEngine"); + isAlive_.store(false); std::shared_lock lock(mutex_); LOGI("~AceEngine: containerMap_ size: %{public}zu", containerMap_.size()); for (const auto& [first, second] : containerMap_) { @@ -84,6 +86,9 @@ void AceEngine::InitJsDumpHeadSignal() void AceEngine::AddContainer(int32_t instanceId, const RefPtr& container) { + if (!isAlive_.load()) { + return; + } LOGI("AddContainer %{public}d", instanceId); std::unique_lock lock(mutex_); const auto result = containerMap_.try_emplace(instanceId, container); @@ -94,6 +99,9 @@ void AceEngine::AddContainer(int32_t instanceId, const RefPtr& contai void AceEngine::RemoveContainer(int32_t instanceId) { + if (!isAlive_.load()) { + return; + } LOGI("RemoveContainer %{public}d", instanceId); size_t num = 0; { @@ -107,6 +115,9 @@ void AceEngine::RemoveContainer(int32_t instanceId) void AceEngine::Dump(const std::vector& params) const { + if (!isAlive_.load()) { + return; + } std::unordered_map> copied; { std::shared_lock lock(mutex_); @@ -125,6 +136,9 @@ void AceEngine::Dump(const std::vector& params) const RefPtr AceEngine::GetContainer(int32_t instanceId) { + if (!isAlive_.load()) { + return nullptr; + } #ifdef PLUGIN_COMPONENT_SUPPORTED if (instanceId >= MIN_PLUGIN_SUBCONTAINER_ID) { instanceId = PluginManager::GetInstance().GetPluginParentContainerId(instanceId); @@ -165,6 +179,9 @@ void AceEngine::DefusingBomb(int32_t instanceId) void AceEngine::TriggerGarbageCollection() { + if (!isAlive_.load()) { + return; + } std::unordered_map> copied; { std::shared_lock lock(mutex_); @@ -193,6 +210,9 @@ void AceEngine::TriggerGarbageCollection() void AceEngine::NotifyContainers(const std::function&)>& callback) { + if (!isAlive_.load()) { + return; + } CHECK_NULL_VOID_NOLOG(callback); std::shared_lock lock(mutex_); for (const auto& [first, second] : containerMap_) { @@ -204,6 +224,9 @@ void AceEngine::NotifyContainers(const std::function> copied; { std::shared_lock lock(mutex_); diff --git a/frameworks/core/common/ace_engine.h b/frameworks/core/common/ace_engine.h index d5c769a733e50196bf8733ef57fcd8e252faa219..3d35791ce721793c3baab12590cad4615ed722bf 100644 --- a/frameworks/core/common/ace_engine.h +++ b/frameworks/core/common/ace_engine.h @@ -16,6 +16,7 @@ #ifndef FOUNDATION_ACE_FRAMEWORKS_CORE_COMMON_ACE_ENGINE_H #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMMON_ACE_ENGINE_H +#include #include #include #include @@ -57,7 +58,7 @@ private: mutable std::shared_mutex mutex_; std::unordered_map> containerMap_; RefPtr watchDog_; - + static std::atomic isAlive_; ACE_DISALLOW_COPY_AND_MOVE(AceEngine); };