diff --git a/frameworks/native/backup_ext/include/ext_extension.h b/frameworks/native/backup_ext/include/ext_extension.h index f69da7d397002cb644b23fc5851dfa332f19cdb0..f3be8b9214573e6cca1dc67166abca4965b20051 100644 --- a/frameworks/native/backup_ext/include/ext_extension.h +++ b/frameworks/native/backup_ext/include/ext_extension.h @@ -70,6 +70,7 @@ public: bundleName_ = bundleName; threadPool_.Start(BConstants::EXTENSION_THREAD_POOL_COUNT); onProcessTaskPool_.Start(BConstants::EXTENSION_THREAD_POOL_COUNT); + reportOnProcessRetPool_.Start(BConstants::EXTENSION_THREAD_POOL_COUNT); SetStagingPathProperties(); } ~BackupExtExtension() @@ -77,6 +78,7 @@ public: onProcessTimeoutTimer_.Shutdown(); threadPool_.Stop(); onProcessTaskPool_.Stop(); + reportOnProcessRetPool_.Stop(); if (callJsOnProcessThread_.joinable()) { callJsOnProcessThread_.join(); } @@ -292,6 +294,9 @@ private: ErrCode IncrementalAllFileReady(const TarMap &pkgInfo, const vector &srcFiles, sptr proxy); + std::function ReportOnProcessResultCallback(wptr obj, + BackupRestoreScenario scenario); + private: std::shared_mutex lock_; std::shared_ptr extension_; @@ -324,6 +329,7 @@ private: OHOS::ThreadPool onProcessTaskPool_; std::atomic isFirstCallOnProcess_ {false}; std::atomic isExecAppDone_ {false}; + OHOS::ThreadPool reportOnProcessRetPool_; BackupRestoreScenario curScenario_ { BackupRestoreScenario::FULL_BACKUP }; }; diff --git a/frameworks/native/backup_ext/src/sub_ext_extension.cpp b/frameworks/native/backup_ext/src/sub_ext_extension.cpp index 6038f48b416ca56b8c9cc7786dee2f9b2e60b951..ea199441797229427a7f55cfc75741eab6649907 100644 --- a/frameworks/native/backup_ext/src/sub_ext_extension.cpp +++ b/frameworks/native/backup_ext/src/sub_ext_extension.cpp @@ -433,7 +433,7 @@ int32_t BackupExtExtension::GetOnStartTimeCost() std::function BackupExtExtension::OnBackupCallback(wptr obj) { - HILOGI("Begin get HandleFullBackupCallbackEx"); + HILOGI("Begin get HandleFullBackupCallback"); return [obj](ErrCode errCode, std::string errMsg) { HILOGI("begin call backup"); auto extensionPtr = obj.promote(); @@ -445,6 +445,10 @@ std::function BackupExtExtension::OnBackupCall HILOGE("Extension handle have been released"); return; } + if (extensionPtr->isExecAppDone_.load()) { + HILOGE("Appdone has been executed for the current application"); + return; + } extensionPtr->FinishOnProcessTask(); if (errCode == ERR_OK) { auto spendTime = extensionPtr->GetOnStartTimeCost(); @@ -481,6 +485,10 @@ std::function BackupExtExtension::OnBackupExCa HILOGE("Extension handle have been released"); return; } + if (extensionPtr->isExecAppDone_.load()) { + HILOGE("Appdone has been executed for the current application"); + return; + } extensionPtr->extension_->InvokeAppExtMethod(errCode, backupExRetInfo); if (errCode == ERR_OK) { if (backupExRetInfo.size()) { @@ -511,9 +519,8 @@ std::function BackupExtExtension::OnBackupExCa std::function BackupExtExtension::IncOnBackupCallback(wptr obj) { - HILOGI("Begin get IncOnBackupCallback"); return [obj](ErrCode errCode, std::string errMsg) { - HILOGI("App onbackup end"); + HILOGI("Begin get IncOnBackupCallback"); auto proxy = ServiceProxy::GetInstance(); if (proxy == nullptr) { throw BError(BError::Codes::EXT_BROKEN_BACKUP_SA, std::generic_category().message(errno)); @@ -523,6 +530,10 @@ std::function BackupExtExtension::IncOnBackupC HILOGE("Current extension execute call backup error, extPtr is empty"); return; } + if (extPtr->isExecAppDone_.load()) { + HILOGE("Appdone has been executed for the current application"); + return; + } HILOGI("Start GetAppLocalListAndDoIncrementalBackup"); extPtr->FinishOnProcessTask(); if (errCode == ERR_OK) { @@ -548,8 +559,8 @@ std::function BackupExtExtension::IncOnBackupC std::function BackupExtExtension::IncOnBackupExCallback(wptr obj) { - HILOGI("Begin get HandleIncBackupEx callback"); return [obj](ErrCode errCode, const std::string backupExRetInfo) { + HILOGI("Begin get HandleIncBackupEx callback"); auto proxy = ServiceProxy::GetInstance(); if (proxy == nullptr) { throw BError(BError::Codes::EXT_BROKEN_BACKUP_SA, std::generic_category().message(errno)); @@ -563,6 +574,10 @@ std::function BackupExtExtension::IncOnBackupE HILOGE("Extension handle have been released"); return; } + if (extPtr->isExecAppDone_.load()) { + HILOGE("Appdone has been executed for the current application"); + return; + } extensionPtr->extension_->InvokeAppExtMethod(errCode, backupExRetInfo); if (errCode == ERR_OK) { if (backupExRetInfo.size()) { @@ -675,37 +690,7 @@ void BackupExtExtension::SyncCallJsOnProcessTask(wptr obj, B HILOGE("Current extension execute finished"); return; } - auto callBack = [obj, scenario](ErrCode errCode, const std::string processInfo) { - auto extPtr = obj.promote(); - if (extPtr == nullptr) { - HILOGE("Async call js onPreocess callback failed, exPtr is empty"); - return; - } - if (extPtr->onProcessTimeout_.load()) { - HILOGE("The result of invoking onProcess is timeout."); - extPtr->onProcessTimeout_.store(false); - return; - } - extPtr->CloseOnProcessTimeOutTimer(); - extPtr->isFirstCallOnProcess_.store(false); - extPtr->onProcessTimeout_.store(false); - if (extPtr->onProcessTimeoutCnt_.load() > 0) { - extPtr->onProcessTimeoutCnt_ = 0; - HILOGI("onProcess execute success, reset onProcessTimeoutCnt"); - } - if (processInfo.size() == 0) { - HILOGE("Current extension has no js method named onProcess."); - std::unique_lock lock(extPtr->onProcessLock_); - extPtr->isFirstCallOnProcess_.store(false); - extPtr->stopCallJsOnProcess_.store(true); - extPtr->execOnProcessCon_.notify_one(); - lock.unlock(); - return; - } - std::string processInfoJsonStr; - BJsonUtil::BuildOnProcessRetInfo(processInfoJsonStr, processInfo); - extPtr->ReportAppProcessInfo(processInfoJsonStr, scenario); - }; + auto callBack = ReportOnProcessResultCallback(obj, scenario); auto extenionPtr = obj.promote(); if (extenionPtr == nullptr) { HILOGE("Async call js onProcess failed, extenionPtr is empty"); @@ -1173,4 +1158,48 @@ int BackupExtExtension::DoIncrementalBackup(const vector smallFiles.size(), allFiles.size()); return err; } + +std::function BackupExtExtension::ReportOnProcessResultCallback( + wptr obj, BackupRestoreScenario scenario) +{ + return [obj, scenario](ErrCode errCode, const std::string processInfo) { + auto extPtr = obj.promote(); + if (extPtr == nullptr) { + HILOGE("Async call js onPreocess callback failed, exPtr is empty"); + return; + } + if (extPtr->onProcessTimeout_.load()) { + HILOGE("The result of invoking onProcess is timeout."); + extPtr->onProcessTimeout_.store(false); + return; + } + extPtr->CloseOnProcessTimeOutTimer(); + extPtr->isFirstCallOnProcess_.store(false); + extPtr->onProcessTimeout_.store(false); + if (extPtr->onProcessTimeoutCnt_.load() > 0) { + extPtr->onProcessTimeoutCnt_ = 0; + HILOGI("onProcess execute success, reset onProcessTimeoutCnt"); + } + if (processInfo.size() == 0) { + HILOGE("Current extension has no js method named onProcess."); + std::unique_lock lock(extPtr->onProcessLock_); + extPtr->isFirstCallOnProcess_.store(false); + extPtr->stopCallJsOnProcess_.store(true); + extPtr->execOnProcessCon_.notify_one(); + lock.unlock(); + return; + } + std::string processInfoJsonStr; + BJsonUtil::BuildOnProcessRetInfo(processInfoJsonStr, processInfo); + auto task = [obj, scenario, processInfoJsonStr]() { + auto reportExtPtr = obj.promote(); + if (reportExtPtr == nullptr) { + HILOGE("Report onProcess Result error, reportExtPtr is empty"); + return; + } + reportExtPtr->ReportAppProcessInfo(processInfoJsonStr, scenario); + }; + extPtr->reportOnProcessRetPool_.AddTask([task]() { task(); }); + }; +} } // namespace OHOS::FileManagement::Backup