diff --git a/cli_tool_framework/services/climgr/include/cli_tool_manager_service.h b/cli_tool_framework/services/climgr/include/cli_tool_manager_service.h index 9a0d0ebac8..7ba379bbe2 100644 --- a/cli_tool_framework/services/climgr/include/cli_tool_manager_service.h +++ b/cli_tool_framework/services/climgr/include/cli_tool_manager_service.h @@ -180,6 +180,7 @@ private: std::atomic interfaceCalledCount_ = 0; ffrt::mutex sessionsMutex_; std::unordered_map> sessionRecords_; + ffrt::mutex observerMutex_; std::unordered_map> bundleObservers_; }; diff --git a/cli_tool_framework/services/climgr/src/cli_tool_manager_service.cpp b/cli_tool_framework/services/climgr/src/cli_tool_manager_service.cpp index a5c2ba443f..63fa25c7d2 100644 --- a/cli_tool_framework/services/climgr/src/cli_tool_manager_service.cpp +++ b/cli_tool_framework/services/climgr/src/cli_tool_manager_service.cpp @@ -659,6 +659,10 @@ void CliToolManagerService::OnProcessDied(const std::string &bundleName, pid_t d { TAG_LOGI(AAFwkTag::CLI_TOOL, "OnProcessDied called: bundleName=%{public}s, diedPid=%{public}d", bundleName.c_str(), diedPid); + { + std::lock_guard guard(observerMutex_); + bundleObservers_.erase(bundleName); + } std::lock_guard guard(sessionsMutex_); // Iterate through sessionRecords_ to find matching SessionRecord by callerPid for (auto iter = sessionRecords_.begin(); iter != sessionRecords_.end();) { @@ -692,6 +696,7 @@ void CliToolManagerService::RegisterAppStateObserver(const std::string &bundleNa bundleName.c_str(), callerPid); // Check if observer already exists for this bundle + std::lock_guard guard(observerMutex_); if (bundleObservers_.find(bundleName) != bundleObservers_.end()) { TAG_LOGI(AAFwkTag::CLI_TOOL, "Observer already registered for bundleName=%{public}s", bundleName.c_str()); return;