From 64583e6149f729091d00999fa0a8b97ab0ac5850 Mon Sep 17 00:00:00 2001 From: yuwenze Date: Sat, 18 Feb 2023 03:47:00 +0000 Subject: [PATCH] snapshot Signed-off-by: yuwenze Change-Id: I7e0fd2e98d501df24616618ce26584dcf87551be --- .../abilitymgr/include/mission_info_mgr.h | 10 +++- .../abilitymgr/src/mission_data_storage.cpp | 2 + services/abilitymgr/src/mission_info_mgr.cpp | 49 ++++++++++++++++++- 3 files changed, 57 insertions(+), 4 deletions(-) diff --git a/services/abilitymgr/include/mission_info_mgr.h b/services/abilitymgr/include/mission_info_mgr.h index 4d730d3dc1c..2e4b531f50e 100644 --- a/services/abilitymgr/include/mission_info_mgr.h +++ b/services/abilitymgr/include/mission_info_mgr.h @@ -16,6 +16,7 @@ #ifndef OHOS_ABILITY_RUNTIME_MISSION_INFO_MGR_H #define OHOS_ABILITY_RUNTIME_MISSION_INFO_MGR_H +#include #include #include #include @@ -136,7 +137,7 @@ public: * @return return true if update mission snapshot success, else false */ bool UpdateMissionSnapshot(int32_t missionId, const sptr& abilityToken, - MissionSnapshot& missionSnapshot, bool isLowResolution = false) const; + MissionSnapshot& missionSnapshot, bool isLowResolution = false); #ifdef SUPPORT_GRAPHICS /** @@ -157,7 +158,7 @@ public: * @return true return true if get mission snapshot success, else false */ bool GetMissionSnapshot(int32_t missionId, const sptr& abilityToken, - MissionSnapshot& missionSnapshot, bool isLowResolution, bool force = false) const; + MissionSnapshot& missionSnapshot, bool isLowResolution, bool force = false); /** * @brief register snapshotHandler @@ -166,6 +167,8 @@ public: void RegisterSnapshotHandler(const sptr& handler); void HandleUnInstallApp(const std::string &bundleName, int32_t uid, std::list &missions); + + void CompleteSaveSnapshot(int32_t missionId); private: /** * @brief Boot query mission info. @@ -185,6 +188,9 @@ private: std::shared_ptr taskDataPersistenceMgr_; sptr snapshotHandler_; mutable std::recursive_mutex mutex_; + std::unordered_map savingSnapshot_; + std::mutex savingSnapshotLock_; + std::condition_variable waitSavingCondition_; }; } // namespace AAFwk } // namespace OHOS diff --git a/services/abilitymgr/src/mission_data_storage.cpp b/services/abilitymgr/src/mission_data_storage.cpp index ad71dbbf094..94db0bc6b13 100644 --- a/services/abilitymgr/src/mission_data_storage.cpp +++ b/services/abilitymgr/src/mission_data_storage.cpp @@ -20,6 +20,7 @@ #include "hilog_wrapper.h" #include "image_source.h" #include "media_errors.h" +#include "mission_info_mgr.h" #ifdef SUPPORT_GRAPHICS #include #include @@ -245,6 +246,7 @@ void MissionDataStorage::SaveSnapshotFile(int32_t missionId, const MissionSnapsh { SaveSnapshotFile(missionId, missionSnapshot.snapshot, missionSnapshot.isPrivate, false); SaveSnapshotFile(missionId, GetReducedPixelMap(missionSnapshot.snapshot), missionSnapshot.isPrivate, true); + DelayedSingleton::GetInstance()->CompleteSaveSnapshot(missionId); } void MissionDataStorage::SaveSnapshotFile(int32_t missionId, const std::shared_ptr& snapshot, diff --git a/services/abilitymgr/src/mission_info_mgr.cpp b/services/abilitymgr/src/mission_info_mgr.cpp index 36b3584e5bf..db8bf2e1e0f 100644 --- a/services/abilitymgr/src/mission_info_mgr.cpp +++ b/services/abilitymgr/src/mission_info_mgr.cpp @@ -411,7 +411,7 @@ void MissionInfoMgr::RegisterSnapshotHandler(const sptr& handl } bool MissionInfoMgr::UpdateMissionSnapshot(int32_t missionId, const sptr& abilityToken, - MissionSnapshot& missionSnapshot, bool isLowResolution) const + MissionSnapshot& missionSnapshot, bool isLowResolution) { HILOG_INFO("Update mission snapshot, missionId:%{public}d.", missionId); std::lock_guard lock(mutex_); @@ -450,14 +450,40 @@ bool MissionInfoMgr::UpdateMissionSnapshot(int32_t missionId, const sptr lock(savingSnapshotLock_); + auto search = savingSnapshot_.find(missionId); + if (search == savingSnapshot_.end()) { + savingSnapshot_[missionId] = 1; + } else { + auto savingCount = search->second + 1; + savingSnapshot_.insert_or_assign(missionId, savingCount); + } + } if (!taskDataPersistenceMgr_->SaveMissionSnapshot(missionId, savedSnapshot)) { HILOG_ERROR("snapshot: save mission snapshot failed"); + CompleteSaveSnapshot(missionId); return false; } HILOG_INFO("snapshot: update mission snapshot success"); return true; } +void MissionInfoMgr::CompleteSaveSnapshot(int32_t missionId) +{ + std::unique_lock lock(savingSnapshotLock_); + auto search = savingSnapshot_.find(missionId); + if (search != savingSnapshot_.end()) { + auto savingCount = search->second - 1; + if (savingCount == 0) { + savingSnapshot_.erase(search); + waitSavingCondition_.notify_one(); + } else { + savingSnapshot_.insert_or_assign(missionId, savingCount); + } + } +} + #ifdef SUPPORT_GRAPHICS std::shared_ptr MissionInfoMgr::GetSnapshot(int32_t missionId) const { @@ -479,7 +505,7 @@ std::shared_ptr MissionInfoMgr::GetSnapshot(int32_t missionId) #endif bool MissionInfoMgr::GetMissionSnapshot(int32_t missionId, const sptr& abilityToken, - MissionSnapshot& missionSnapshot, bool isLowResolution, bool force) const + MissionSnapshot& missionSnapshot, bool isLowResolution, bool force) { HILOG_INFO("mission_list_info GetMissionSnapshot, missionId:%{public}d, force:%{public}d", missionId, force); std::lock_guard lock(mutex_); @@ -500,6 +526,25 @@ bool MissionInfoMgr::GetMissionSnapshot(int32_t missionId, const sptr lock(savingSnapshotLock_); + auto search = savingSnapshot_.find(missionId); + if (search != savingSnapshot_.end()) { + auto savingSnapshotTimeout = 100; // ms + std::chrono::milliseconds timeout { savingSnapshotTimeout }; + auto waitingCount = 5; + auto waitingNum = 0; + while (waitSavingCondition_.wait_for(lock, timeout) == std::cv_status::no_timeout) { + ++waitingNum; + auto iter = savingSnapshot_.find(missionId); + if (iter == savingSnapshot_.end() || waitingNum == waitingCount) { + HILOG_INFO("Saved successfully or waiting failed."); + break; + } + } + } + } + if (taskDataPersistenceMgr_->GetMissionSnapshot(missionId, missionSnapshot, isLowResolution)) { missionSnapshot.topAbility = it->missionInfo.want.GetElement(); HILOG_ERROR("mission_list_info GetMissionSnapshot, find snapshot OK, missionId:%{public}d", missionId); -- Gitee