diff --git a/services/bundlemgr/include/distributed_manager/bundle_distributed_manager.h b/services/bundlemgr/include/distributed_manager/bundle_distributed_manager.h index d02f82211dd3e9a28b0f1d1729de2faa70d630c1..1344ef79a5df1b30dbf1a73cb81734bfd898f750 100644 --- a/services/bundlemgr/include/distributed_manager/bundle_distributed_manager.h +++ b/services/bundlemgr/include/distributed_manager/bundle_distributed_manager.h @@ -16,6 +16,8 @@ #ifndef FOUNDATION_APPEXECFWK_SERVICES_BUNDLEMGR_INCLUDE_DISTRIBUTED_MANAGER_BUNDLE_DISTRIBUTED_MANAGER_H #define FOUNDATION_APPEXECFWK_SERVICES_BUNDLEMGR_INCLUDE_DISTRIBUTED_MANAGER_BUNDLE_DISTRIBUTED_MANAGER_H +#include + #include "event_handler.h" #include "event_runner.h" #include "iremote_broker.h" @@ -49,6 +51,7 @@ private: transactId_++; return transactId_.load(); } + std::shared_mutex mutex_; mutable std::atomic transactId_ = 0; std::shared_ptr handler_; diff --git a/services/bundlemgr/src/distributed_manager/bundle_distributed_manager.cpp b/services/bundlemgr/src/distributed_manager/bundle_distributed_manager.cpp index f1bfbdb6edf8fac847d063a61c3ae3a867be019c..b4439cf534e647bca0706eb3a41ee629b6cb9006 100644 --- a/services/bundlemgr/src/distributed_manager/bundle_distributed_manager.cpp +++ b/services/bundlemgr/src/distributed_manager/bundle_distributed_manager.cpp @@ -161,10 +161,13 @@ bool BundleDistributedManager::CheckAbilityEnableInstall( queryRpcIdParams->callback = callback; queryRpcIdParams->want = want; queryRpcIdParams->versionCode = applicationInfo.versionCode; - auto ret = queryAbilityParamsMap_.emplace(targetAbilityInfo.targetInfo.transactId, *queryRpcIdParams); - if (!ret.second) { - APP_LOGE("BundleDistributedManager::QueryAbilityInfo map emplace error"); - return false; + { + std::unique_lock lock(mutex_); + auto ret = queryAbilityParamsMap_.emplace(targetAbilityInfo.targetInfo.transactId, *queryRpcIdParams); + if (!ret.second) { + APP_LOGE("BundleDistributedManager::QueryAbilityInfo map emplace error"); + return false; + } } auto queryRpcIdByAbilityFunc = [this, targetAbilityInfo]() { this->QueryRpcIdByAbilityToServiceCenter(targetAbilityInfo); @@ -243,34 +246,55 @@ void BundleDistributedManager::OnQueryRpcIdFinished(const std::string &queryRpcI APP_LOGE("Parse info from json fail"); return; } - auto queryAbilityParams = queryAbilityParamsMap_.find(rpcIdResult.transactId); - if (queryAbilityParams == queryAbilityParamsMap_.end()) { - APP_LOGE("Can not find node in %{public}s function", __func__); - return; + Want want; + { + std::shared_lock lock(mutex_); + auto queryAbilityParams = queryAbilityParamsMap_.find(rpcIdResult.transactId); + if (queryAbilityParams == queryAbilityParamsMap_.end()) { + APP_LOGE("Can not find node in %{public}s function", __func__); + return; + } + want = queryAbilityParams->second.want; } + if (handler_ != nullptr) { handler_->RemoveTask(rpcIdResult.transactId); } - int32_t ret = ComparePcIdString(queryAbilityParams->second.want, rpcIdResult); + if (rpcIdResult.retCode != 0) { + APP_LOGE("query RpcId fail%{public}d", rpcIdResult.retCode); + SendCallbackRequest(rpcIdResult.retCode, rpcIdResult.transactId); + return; + } + int32_t ret = ComparePcIdString(want, rpcIdResult); if (ret != 0) { APP_LOGE("Compare pcId fail%{public}d", ret); - SendCallbackRequest(ret, rpcIdResult.transactId); - } else { - SendCallbackRequest(rpcIdResult.retCode, rpcIdResult.transactId); } + SendCallbackRequest(ret, rpcIdResult.transactId); } void BundleDistributedManager::SendCallbackRequest(int32_t resultCode, const std::string &transactId) { APP_LOGI("sendCallbackRequest resultCode:%{public}d, transactId:%{public}s", resultCode, transactId.c_str()); - auto queryAbilityParams = queryAbilityParamsMap_.find(transactId); - if (queryAbilityParams == queryAbilityParamsMap_.end()) { - APP_LOGE("Can not find transactId:%{public}s in queryAbilityParamsMap", transactId.c_str()); - return; + QueryRpcIdParams queryRpcIdParams; + { + std::shared_lock lock(mutex_); + auto queryAbilityParams = queryAbilityParamsMap_.find(transactId); + if (queryAbilityParams == queryAbilityParamsMap_.end()) { + APP_LOGE("Can not find transactId:%{public}s in queryAbilityParamsMap", transactId.c_str()); + return; + } + queryRpcIdParams = queryAbilityParams->second; + } + SendCallback(resultCode, queryRpcIdParams); + + uint32_t mapSize; + { + std::unique_lock lock(mutex_); + queryAbilityParamsMap_.erase(transactId); + mapSize = queryAbilityParamsMap_.size(); } - SendCallback(resultCode, queryAbilityParams->second); - queryAbilityParamsMap_.erase(transactId); - if (queryAbilityParamsMap_.size() == 0) { + + if (mapSize == 0) { auto connectAbility = DelayedSingleton::GetInstance()->GetConnectAbility(); if (connectAbility == nullptr) { APP_LOGW("fail to connect ServiceCenter");