!5355 修复多线程同时读写map导致崩溃

Merge pull request !5355 from liuliu/fixmap
This commit is contained in:
openharmony_ci
2023-05-18 09:32:47 +00:00
committed by Gitee
2 changed files with 19 additions and 6 deletions
@@ -20,6 +20,7 @@
#include <list>
#include <map>
#include <memory>
#include <mutex>
#include "iremote_object.h"
#include "ability_info.h"
@@ -85,7 +86,7 @@ public:
*
* @return Returns the abilities info for the application record.
*/
const std::map<const sptr<IRemoteObject>, std::shared_ptr<AbilityRunningRecord>> &GetAbilities() const;
const std::map<const sptr<IRemoteObject>, std::shared_ptr<AbilityRunningRecord>> GetAbilities() const;
std::shared_ptr<AbilityRunningRecord> GetAbilityByTerminateLists(const sptr<IRemoteObject> &token) const;
@@ -162,6 +163,7 @@ private:
ModuleRecordState GetState() const;
private:
mutable std::recursive_mutex abilitiesMutex_;
std::map<const sptr<IRemoteObject>, std::shared_ptr<AbilityRunningRecord>> abilities_;
std::map<const sptr<IRemoteObject>, std::shared_ptr<AbilityRunningRecord>> terminateAbilities_;
std::weak_ptr<AppMgrServiceInner> appMgrServiceInner_;
+16 -5
View File
@@ -55,6 +55,7 @@ std::shared_ptr<AbilityRunningRecord> ModuleRunningRecord::GetAbilityRunningReco
HILOG_ERROR("token is null");
return nullptr;
}
std::lock_guard<std::recursive_mutex> lock(abilitiesMutex_);
const auto &iter = abilities_.find(token);
if (iter != abilities_.end()) {
return iter->second;
@@ -82,6 +83,7 @@ std::shared_ptr<AbilityRunningRecord> ModuleRunningRecord::AddAbility(const sptr
if (want) {
abilityRecord->SetOwnerUserId(want->GetIntParam(ABILITY_OWNER_USERID, -1));
}
std::lock_guard<std::recursive_mutex> lock(abilitiesMutex_);
abilities_.emplace(token, abilityRecord);
return abilityRecord;
}
@@ -92,13 +94,14 @@ bool ModuleRunningRecord::IsLastAbilityRecord(const sptr<IRemoteObject> &token)
HILOG_ERROR("token is nullptr");
return false;
}
std::lock_guard<std::recursive_mutex> lock(abilitiesMutex_);
return ((abilities_.size() == 1) && (abilities_.find(token) != abilities_.end()));
}
int32_t ModuleRunningRecord::GetPageAbilitySize()
{
int pageAbilitySize = 0;
std::lock_guard<std::recursive_mutex> lock(abilitiesMutex_);
for (auto it : abilities_) {
std::shared_ptr<AbilityRunningRecord> abilityRunningRecord = it.second;
std::shared_ptr<AbilityInfo> abilityInfo = abilityRunningRecord->GetAbilityInfo();
@@ -110,9 +113,10 @@ int32_t ModuleRunningRecord::GetPageAbilitySize()
return pageAbilitySize;
}
const std::map<const sptr<IRemoteObject>, std::shared_ptr<AbilityRunningRecord>> &ModuleRunningRecord::GetAbilities()
const std::map<const sptr<IRemoteObject>, std::shared_ptr<AbilityRunningRecord>> ModuleRunningRecord::GetAbilities()
const
{
std::lock_guard<std::recursive_mutex> lock(abilitiesMutex_);
return abilities_;
}
@@ -123,6 +127,7 @@ std::shared_ptr<AbilityRunningRecord> ModuleRunningRecord::GetAbilityByTerminate
HILOG_ERROR("GetAbilityByTerminateLists error, token is null");
return nullptr;
}
std::lock_guard<std::recursive_mutex> lock(abilitiesMutex_);
const auto &iter = terminateAbilities_.find(token);
if (iter != terminateAbilities_.end()) {
return iter->second;
@@ -133,6 +138,7 @@ std::shared_ptr<AbilityRunningRecord> ModuleRunningRecord::GetAbilityByTerminate
std::shared_ptr<AbilityRunningRecord> ModuleRunningRecord::GetAbilityRunningRecord(const int64_t eventId) const
{
HILOG_INFO("Get ability running record by eventId.");
std::lock_guard<std::recursive_mutex> lock(abilitiesMutex_);
const auto &iter = std::find_if(abilities_.begin(), abilities_.end(), [eventId](const auto &pair) {
return pair.second->GetEventId() == eventId;
});
@@ -174,6 +180,7 @@ void ModuleRunningRecord::LaunchAbility(const std::shared_ptr<AbilityRunningReco
HILOG_ERROR("null abilityRecord or abilityToken");
return;
}
std::lock_guard<std::recursive_mutex> lock(abilitiesMutex_);
const auto &iter = abilities_.find(ability->GetToken());
if (iter != abilities_.end() && appLifeCycleDeal_->GetApplicationClient()) {
HILOG_INFO("Schedule launch ability, name is %{public}s.", ability->GetName().c_str());
@@ -187,7 +194,7 @@ void ModuleRunningRecord::LaunchAbility(const std::shared_ptr<AbilityRunningReco
void ModuleRunningRecord::LaunchPendingAbilities()
{
HILOG_INFO("Launch pending abilities.");
std::lock_guard<std::recursive_mutex> lock(abilitiesMutex_);
if (abilities_.empty()) {
HILOG_ERROR("abilities_ is empty");
return;
@@ -211,8 +218,11 @@ void ModuleRunningRecord::TerminateAbility(const std::shared_ptr<AppRunningRecor
return;
}
terminateAbilities_.emplace(token, abilityRecord);
abilities_.erase(token);
{
std::lock_guard<std::recursive_mutex> lock(abilitiesMutex_);
terminateAbilities_.emplace(token, abilityRecord);
abilities_.erase(token);
}
if (!isForce) {
auto curAbilityState = abilityRecord->GetState();
@@ -262,6 +272,7 @@ void ModuleRunningRecord::AbilityTerminated(const sptr<IRemoteObject> &token)
}
if (RemoveTerminateAbilityTimeoutTask(token)) {
std::lock_guard<std::recursive_mutex> lock(abilitiesMutex_);
terminateAbilities_.erase(token);
}
}