From 434aa940671a4b5077a319a1d4d159a6ad065575 Mon Sep 17 00:00:00 2001 From: yangzk Date: Mon, 3 Jul 2023 11:06:40 +0800 Subject: [PATCH 1/2] =?UTF-8?q?Description:=20=E4=BC=98=E5=8C=96GetAbility?= =?UTF-8?q?List=E3=80=81AbilityLockGuard=20IssueNo:=20#I7HTGX=20Sig:=20SIG?= =?UTF-8?q?=5FApplicationFramework=20Feature=20or=20Bugfix:=20Bugfix=20Bin?= =?UTF-8?q?ary=20Source:=20No?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yangzk Change-Id: I033c8ac9013b4d4a0921891c2b6737e061a8c89e --- .../include/slite/ability_list.h | 2 +- .../include/slite/ability_lock_guard.h | 2 +- .../src/slite/ability_list.cpp | 8 ++--- .../src/slite/ability_record_manager.cpp | 36 +++++++++++++++---- .../slite/ability_record_observer_manager.cpp | 2 +- 5 files changed, 36 insertions(+), 14 deletions(-) diff --git a/services/abilitymgr_lite/include/slite/ability_list.h b/services/abilitymgr_lite/include/slite/ability_list.h index dc8e011..9557731 100644 --- a/services/abilitymgr_lite/include/slite/ability_list.h +++ b/services/abilitymgr_lite/include/slite/ability_list.h @@ -51,7 +51,7 @@ public: MissionInfoList *GetMissionInfos(uint32_t maxNum) const; - const List GetAbilityList(uint32_t mission); + void GetAbilityList(uint32_t mission, List &result); void PopBottomAbility(); diff --git a/services/abilitymgr_lite/include/slite/ability_lock_guard.h b/services/abilitymgr_lite/include/slite/ability_lock_guard.h index f23f097..f546d07 100644 --- a/services/abilitymgr_lite/include/slite/ability_lock_guard.h +++ b/services/abilitymgr_lite/include/slite/ability_lock_guard.h @@ -24,7 +24,7 @@ class AbilityLockGuard { public: explicit AbilityLockGuard(osMutexId_t& mutex): mutex_(mutex) { - osMutexAcquire(mutex_, 0); + osMutexAcquire(mutex_, osWaitForever); } ~AbilityLockGuard() diff --git a/services/abilitymgr_lite/src/slite/ability_list.cpp b/services/abilitymgr_lite/src/slite/ability_list.cpp index 3bb2f89..e042de3 100644 --- a/services/abilitymgr_lite/src/slite/ability_list.cpp +++ b/services/abilitymgr_lite/src/slite/ability_list.cpp @@ -111,18 +111,16 @@ void AbilityList::Erase(uint16_t token) } } -const List AbilityList::GetAbilityList(uint32_t mission) +void AbilityList::GetAbilityList(uint32_t mission, List &result) { - List result; AbilityLockGuard locker(abilityListMutex_); + for (auto node = abilityList_.Begin(); node != abilityList_.End(); node = node->next_) { AbilityRecord *record = node->value_; if ((record != nullptr) && (record->mission == mission)) { - result.PushFront(record); + result.PushFront(record->token); } } - - return result; } uint32_t AbilityList::Size() const diff --git a/services/abilitymgr_lite/src/slite/ability_record_manager.cpp b/services/abilitymgr_lite/src/slite/ability_record_manager.cpp index 3c5ee47..1043f02 100644 --- a/services/abilitymgr_lite/src/slite/ability_record_manager.cpp +++ b/services/abilitymgr_lite/src/slite/ability_record_manager.cpp @@ -372,17 +372,35 @@ int32_t AbilityRecordManager::TerminateMission(uint32_t mission) return PARAM_NULL_ERROR; } - const List &list = abilityList_.GetAbilityList(mission); + List list; + abilityList_.GetAbilityList(mission, list); for (auto node = list.Begin(); node != list.End(); node = node->next_) { - AbilityRecord *record = node->value_; - if ((record != nullptr) && (record->token != topRecord->token)) { - TerminateAbility(record->token); + uint16_t token = static_cast(node->value_); + if (token != topRecord->token) { + TerminateAbility(token); } } return ERR_OK; } +bool IsPermanentAbility(const AbilityRecord &abilityRecord) +{ + if (abilityRecord.appName == nullptr) { + return false; + } + + if (abilityRecord.token == LAUNCHER_TOKEN) { + return true; + } + + if (strcmp(abilityRecord.appName, MAIN_BUNDLE_NAME) == 0) { + return true; + } + + return false; +} + int32_t AbilityRecordManager::TerminateAbility(uint16_t token, const Want* want) { HILOG_INFO(HILOG_MODULE_AAFWK, "TerminateAbility [%{public}u]", token); @@ -422,7 +440,7 @@ int32_t AbilityRecordManager::TerminateAbility(uint16_t token, const Want* want) // 2. terminate non-top ability if (token != topToken) { AbilityRecord* abilityRecord = abilityList_.Get(token); - if ((abilityRecord == nullptr) || (abilityRecord->token == LAUNCHER_TOKEN)) { + if ((abilityRecord == nullptr) || (IsPermanentAbility(*abilityRecord))) { isAppScheduling_ = false; return PARAM_CHECK_ERROR; } @@ -440,7 +458,7 @@ int32_t AbilityRecordManager::TerminateAbility(uint16_t token, const Want* want) return PARAM_NULL_ERROR; } - if (token != LAUNCHER_TOKEN) { + if (!IsPermanentAbility(*topRecord)) { topRecord->isTerminated = true; abilityList_.Add(topRecord); } else { @@ -719,6 +737,7 @@ int32_t AbilityRecordManager::CreateAppTask(AbilityRecord *record) record->taskId = record->abilityThread->GetAppTaskId(); record->jsAppQueueId = record->abilityThread->GetMessageQueueId(); record->state = SCHEDULE_STOP; + #ifndef _MINI_MULTI_TASKS_ APP_EVENT(MT_ACE_APP_START); abilityList_.Add(record); @@ -744,6 +763,7 @@ uint16_t AbilityRecordManager::GenerateToken() if (token == UINT16_MAX - 1) { token = LAUNCHER_TOKEN; } + #ifndef _MINI_MULTI_TASKS_ return ++token; #else @@ -842,6 +862,7 @@ void AbilityRecordManager::OnBackgroundDone(uint16_t token) { HILOG_INFO(HILOG_MODULE_AAFWK, "OnBackgroundDone [%{public}u]", token); SetAbilityStateAndNotify(token, SCHEDULE_BACKGROUND); + #ifndef _MINI_MULTI_TASKS_ const AbilityRecord *topRecord = abilityList_.GetTopAbility(); if (topRecord == nullptr) { @@ -960,6 +981,7 @@ void AbilityRecordManager::OnDestroyDone(uint16_t token) HILOG_ERROR(HILOG_MODULE_AAFWK, "record stack is empty"); return; } + isAppScheduling_ = false; StartAbility(topRecord); } pendingToken_ = 0; @@ -969,6 +991,7 @@ void AbilityRecordManager::OnDestroyDone(uint16_t token) if (pendingToken_ == 0 && CreateAppTask(topAbilityRecord) != ERR_OK) { abilityList_.Erase(topAbilityRecord->token); delete topAbilityRecord; + isAppScheduling_ = false; } } #endif @@ -980,6 +1003,7 @@ int32_t AbilityRecordManager::SchedulerLifecycle(uint64_t token, int32_t state) if (record == nullptr) { return PARAM_NULL_ERROR; } + #ifndef _MINI_MULTI_TASKS_ return ScheduleLifecycleInner(record, state); #else diff --git a/services/abilitymgr_lite/src/slite/ability_record_observer_manager.cpp b/services/abilitymgr_lite/src/slite/ability_record_observer_manager.cpp index 6a52259..aff4774 100644 --- a/services/abilitymgr_lite/src/slite/ability_record_observer_manager.cpp +++ b/services/abilitymgr_lite/src/slite/ability_record_observer_manager.cpp @@ -61,4 +61,4 @@ void AbilityRecordObserverManager::NotifyAbilityRecordCleanup(char *appName) } } } // namespace AbilitySlite -} // namespace OHOS +} // namespace OHOS \ No newline at end of file -- Gitee From bbb459a97a90d0385a037d06593f6972b298f23d Mon Sep 17 00:00:00 2001 From: yangzk Date: Tue, 4 Jul 2023 09:47:57 +0800 Subject: [PATCH 2/2] =?UTF-8?q?Description:=20SendRequest=E5=A4=B1?= =?UTF-8?q?=E8=B4=A5=E5=90=8E=E9=87=8D=E8=AF=95=E3=80=81main=E5=92=8Claunc?= =?UTF-8?q?her=E7=89=B9=E6=AE=8A=E5=A4=84=E7=90=86=20IssueNo:=20#I7HTGX=20?= =?UTF-8?q?Sig:=20SIG=5FApplicationFramework=20Feature=20or=20Bugfix:=20Bu?= =?UTF-8?q?gfix=20Binary=20Source:=20No?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yangzk Change-Id: Ie377ae1649cb47baf2710899b10eee495eb024e2 --- .../include/slite/abilityms_slite_client.h | 2 + .../src/slite/abilityms_slite_client.cpp | 35 +++++--- .../abilitymgr_lite/slite/mission_info.h | 4 +- .../include/slite/ability_list.h | 5 ++ .../include/slite/ability_lock_guard.h | 2 +- .../src/slite/ability_list.cpp | 63 +++++++++++++- .../src/slite/ability_record_manager.cpp | 83 +++---------------- .../slite/ability_record_observer_manager.cpp | 2 +- .../src/slite/ability_thread.cpp | 19 ++++- 9 files changed, 122 insertions(+), 93 deletions(-) diff --git a/frameworks/abilitymgr_lite/include/slite/abilityms_slite_client.h b/frameworks/abilitymgr_lite/include/slite/abilityms_slite_client.h index d2f3e45..a97da58 100644 --- a/frameworks/abilitymgr_lite/include/slite/abilityms_slite_client.h +++ b/frameworks/abilitymgr_lite/include/slite/abilityms_slite_client.h @@ -69,6 +69,8 @@ private: ~AbilityMsClient() = default; + int32_t SendRequestToAms(Request &request) const; + AmsSliteInterface *amsProxy_ { nullptr }; const Identity *identity_ { nullptr }; diff --git a/frameworks/abilitymgr_lite/src/slite/abilityms_slite_client.cpp b/frameworks/abilitymgr_lite/src/slite/abilityms_slite_client.cpp index 85c1647..64e281a 100644 --- a/frameworks/abilitymgr_lite/src/slite/abilityms_slite_client.cpp +++ b/frameworks/abilitymgr_lite/src/slite/abilityms_slite_client.cpp @@ -52,6 +52,21 @@ bool AbilityMsClient::Initialize() const return false; } +int32_t AbilityMsClient::SendRequestToAms(Request &request) const +{ + int32_t retry = RETRY_TIMES; + while (retry--) { + int32_t ret = SAMGR_SendRequest(identity_, &request, nullptr); + if (ret == EC_SUCCESS) { + return ERR_OK; + } + HILOG_WARN(HILOG_MODULE_APP, "SendRequestToAms SAMGR_SendRequest failed with %{public}d", ret); + osDelay(ERROR_SLEEP_TIMES); // sleep 300ms + } + HILOG_ERROR(HILOG_MODULE_APP, "SendRequestToAms failed."); + return IPC_REQUEST_ERROR; +} + int32_t AbilityMsClient::StartAbility(const Want *want) const { if (want == nullptr || want->element == nullptr || !Initialize()) { @@ -92,7 +107,7 @@ int32_t AbilityMsClient::StartAbility(const Want *want) const .data = data, .msgValue = 0, }; - return SAMGR_SendRequest(identity_, &request, nullptr); + return SendRequestToAms(request); } int32_t AbilityMsClient::TerminateAbility(uint64_t token) const @@ -106,7 +121,7 @@ int32_t AbilityMsClient::TerminateAbility(uint64_t token) const .data = nullptr, .msgValue = static_cast(token & TRANSACTION_MSG_TOKEN_MASK), }; - return SAMGR_SendRequest(identity_, &request, nullptr); + return SendRequestToAms(request); } int32_t AbilityMsClient::TerminateMission(uint32_t mission) const @@ -117,7 +132,7 @@ int32_t AbilityMsClient::TerminateMission(uint32_t mission) const .data = nullptr, .msgValue = mission, }; - return SAMGR_SendRequest(identity_, &request, nullptr); + return SendRequestToAms(request); } int32_t AbilityMsClient::TerminateAll(const char* excludedBundleName) const @@ -135,7 +150,7 @@ int32_t AbilityMsClient::TerminateAll(const char* excludedBundleName) const .data = data, .msgValue = 0, }; - return SAMGR_SendRequest(identity_, &request, nullptr); + return SendRequestToAms(request); } int32_t AbilityMsClient::SchedulerLifecycleDone(uint64_t token, int32_t state) const @@ -150,7 +165,7 @@ int32_t AbilityMsClient::SchedulerLifecycleDone(uint64_t token, int32_t state) c .msgValue = static_cast((token & TRANSACTION_MSG_TOKEN_MASK) | (state << TRANSACTION_MSG_STATE_OFFSET)), }; - return SAMGR_SendRequest(identity_, &request, nullptr); + return SendRequestToAms(request); } int32_t AbilityMsClient::ForceStopBundle(uint64_t token) const @@ -164,7 +179,7 @@ int32_t AbilityMsClient::ForceStopBundle(uint64_t token) const .data = nullptr, .msgValue = static_cast(token & TRANSACTION_MSG_TOKEN_MASK), }; - return SAMGR_SendRequest(identity_, &request, nullptr); + return SendRequestToAms(request); } ElementName *AbilityMsClient::GetTopAbility() const @@ -201,7 +216,7 @@ int32_t AbilityMsClient::ForceStop(const char *bundleName) const .len = sizeof(Want), .data = want, }; - return SAMGR_SendRequest(identity_, &request, nullptr); + return SendRequestToAms(request); } int32_t AbilityMsClient::ForceStop(const Want *want) const @@ -232,7 +247,7 @@ int32_t AbilityMsClient::ForceStop(const Want *want) const .len = sizeof(Want), .data = info, }; - return SAMGR_SendRequest(identity_, &request, nullptr); + return SendRequestToAms(request); } int32_t AbilityMsClient::AddAbilityRecordObserver(AbilityRecordObserver *observer) @@ -247,7 +262,7 @@ int32_t AbilityMsClient::AddAbilityRecordObserver(AbilityRecordObserver *observe .msgValue = reinterpret_cast(observer), }; - return SAMGR_SendRequest(identity_, &request, nullptr); + return SendRequestToAms(request); } int32_t AbilityMsClient::RemoveAbilityRecordObserver(AbilityRecordObserver *observer) @@ -262,7 +277,7 @@ int32_t AbilityMsClient::RemoveAbilityRecordObserver(AbilityRecordObserver *obse .msgValue = reinterpret_cast(observer), }; - return SAMGR_SendRequest(identity_, &request, nullptr); + return SendRequestToAms(request); } MissionInfoList *AbilityMsClient::GetMissionInfos(uint32_t maxNum) const diff --git a/interfaces/inner_api/abilitymgr_lite/slite/mission_info.h b/interfaces/inner_api/abilitymgr_lite/slite/mission_info.h index 2001bc5..843dbca 100644 --- a/interfaces/inner_api/abilitymgr_lite/slite/mission_info.h +++ b/interfaces/inner_api/abilitymgr_lite/slite/mission_info.h @@ -48,8 +48,8 @@ struct MissionInfoList { MissionInfoList &operator=(const MissionInfoList &) = delete; MissionInfo *missionInfos = nullptr; - int32_t length = 0; + uint32_t length = 0; }; } // namespace AbilitySlite } // namespace OHOS -#endif // OHOS_ABILITY_SLITE_MISSION_INFO_H \ No newline at end of file +#endif // OHOS_ABILITY_SLITE_MISSION_INFO_H diff --git a/services/abilitymgr_lite/include/slite/ability_list.h b/services/abilitymgr_lite/include/slite/ability_list.h index 9557731..5792c02 100644 --- a/services/abilitymgr_lite/include/slite/ability_list.h +++ b/services/abilitymgr_lite/include/slite/ability_list.h @@ -24,6 +24,7 @@ namespace OHOS { namespace AbilitySlite { constexpr char MAIN_BUNDLE_NAME[] = "main"; +const uint32_t LAUNCHER_TOKEN = 0; class AbilityList { public: @@ -55,6 +56,10 @@ public: void PopBottomAbility(); + int32_t PopAllAbility(const char *excludedBundleName); + + static bool IsPermanentAbility(const AbilityRecord &abilityRecord); + private: List abilityList_ {}; mutable osMutexId_t abilityListMutex_; diff --git a/services/abilitymgr_lite/include/slite/ability_lock_guard.h b/services/abilitymgr_lite/include/slite/ability_lock_guard.h index f546d07..1d59e2f 100644 --- a/services/abilitymgr_lite/include/slite/ability_lock_guard.h +++ b/services/abilitymgr_lite/include/slite/ability_lock_guard.h @@ -39,4 +39,4 @@ private: }; } // AbilitySlite } // namespace OHOS -#endif // OHOS_ABILITY_SLITE_ABILITY_LOCK_GUARD_H \ No newline at end of file +#endif // OHOS_ABILITY_SLITE_ABILITY_LOCK_GUARD_H diff --git a/services/abilitymgr_lite/src/slite/ability_list.cpp b/services/abilitymgr_lite/src/slite/ability_list.cpp index e042de3..e73163e 100644 --- a/services/abilitymgr_lite/src/slite/ability_list.cpp +++ b/services/abilitymgr_lite/src/slite/ability_list.cpp @@ -14,10 +14,12 @@ */ #include -#include "ability_record.h" +#include "abilityms_log.h" +#include "ability_errors.h" #include "ability_list.h" #include "ability_lock_guard.h" -#include "abilityms_log.h" +#include "ability_record.h" +#include "ability_record_observer_manager.h" namespace OHOS { namespace AbilitySlite { @@ -174,7 +176,7 @@ MissionInfoList *AbilityList::GetMissionInfos(uint32_t maxNum) const delete missionInfoList; return nullptr; } - int32_t i = 0; + uint32_t i = 0; for (auto it = abilityList_.Begin(); i < missionInfoList->length; it = it->next_) { missionInfoList->missionInfos[i++].SetAppName(it->value_->appName); } @@ -189,7 +191,7 @@ void AbilityList::PopBottomAbility() abilityList_.PopBack(); return; } - if (lastRecord->appName == nullptr || strcmp(lastRecord->appName, MAIN_BUNDLE_NAME) != 0) { + if (!IsPermanentAbility(*lastRecord)) { abilityList_.PopBack(); delete lastRecord; return; @@ -201,5 +203,58 @@ void AbilityList::PopBottomAbility() delete secondLastRecord; abilityList_.PushBack(lastRecord); // push back home } + +int32_t AbilityList::PopAllAbility(const char *excludedBundleName) +{ + AbilityLockGuard locker(abilityListMutex_); + OHOS::List reservedRecordList {}; + AbilityRecord *topRecord = abilityList_.Front(); + if (topRecord == nullptr) { + return PARAM_NULL_ERROR; + } + abilityList_.PopFront(); + reservedRecordList.PushFront(topRecord); + + while (abilityList_.Size() > 0) { + AbilityRecord *record = abilityList_.Front(); + abilityList_.PopFront(); + if (record == nullptr) { + continue; + } + if (AbilityList::IsPermanentAbility(*record)) { + reservedRecordList.PushFront(record); + continue; + } + if (excludedBundleName != nullptr && strcmp(record->appName, excludedBundleName) == 0) { + reservedRecordList.PushFront(record); + continue; + } + AbilityRecordObserverManager::GetInstance().NotifyAbilityRecordCleanup(record->appName); + delete record; + } + while (reservedRecordList.Size() > 0) { + AbilityRecord *record = reservedRecordList.Front(); + reservedRecordList.PopFront(); + if (record == nullptr) { + continue; + } + abilityList_.PushFront(record); + } + return ERR_OK; +} + +bool AbilityList::IsPermanentAbility(const AbilityRecord &abilityRecord) +{ + if (abilityRecord.appName == nullptr) { + return false; + } + if (abilityRecord.token == LAUNCHER_TOKEN) { + return true; + } + if (strcmp(abilityRecord.appName, MAIN_BUNDLE_NAME) == 0) { + return true; + } + return false; +} } // namespace AbilitySlite } // namespace OHOS diff --git a/services/abilitymgr_lite/src/slite/ability_record_manager.cpp b/services/abilitymgr_lite/src/slite/ability_record_manager.cpp index 1043f02..1a3fd1a 100644 --- a/services/abilitymgr_lite/src/slite/ability_record_manager.cpp +++ b/services/abilitymgr_lite/src/slite/ability_record_manager.cpp @@ -44,7 +44,6 @@ using namespace OHOS::ACELite; namespace OHOS { namespace AbilitySlite { -constexpr uint16_t LAUNCHER_TOKEN = 0; constexpr int32_t QUEUE_LENGTH = 32; constexpr int32_t APP_TASK_PRI = 25; @@ -247,6 +246,7 @@ int32_t AbilityRecordManager::StartAbility(const Want *want) return ret; } +#ifndef _MINI_MULTI_TASKS_ void AbilityRecordManager::UpdateRecord(AbilitySvcInfo *info) { if (info == nullptr) { @@ -261,6 +261,7 @@ void AbilityRecordManager::UpdateRecord(AbilitySvcInfo *info) } record->SetWantData(info->data, info->dataLength); } +#endif // _MINI_MULTI_TASKS_ int32_t AbilityRecordManager::StartAbility(AbilitySvcInfo *info) { @@ -384,23 +385,6 @@ int32_t AbilityRecordManager::TerminateMission(uint32_t mission) return ERR_OK; } -bool IsPermanentAbility(const AbilityRecord &abilityRecord) -{ - if (abilityRecord.appName == nullptr) { - return false; - } - - if (abilityRecord.token == LAUNCHER_TOKEN) { - return true; - } - - if (strcmp(abilityRecord.appName, MAIN_BUNDLE_NAME) == 0) { - return true; - } - - return false; -} - int32_t AbilityRecordManager::TerminateAbility(uint16_t token, const Want* want) { HILOG_INFO(HILOG_MODULE_AAFWK, "TerminateAbility [%{public}u]", token); @@ -433,14 +417,14 @@ int32_t AbilityRecordManager::TerminateAbility(uint16_t token, const Want* want) return ScheduleLifecycleInner(topRecord, SLITE_STATE_BACKGROUND); #else // 1. only launcher in the ability stack - if (abilityList_.Size() == 1 && topToken == LAUNCHER_TOKEN) { + if (abilityList_.Size() == 1 && AbilityList::IsPermanentAbility(*topRecord)) { isAppScheduling_ = false; return ERR_OK; } // 2. terminate non-top ability if (token != topToken) { AbilityRecord* abilityRecord = abilityList_.Get(token); - if ((abilityRecord == nullptr) || (IsPermanentAbility(*abilityRecord))) { + if ((abilityRecord == nullptr) || (AbilityList::IsPermanentAbility(*abilityRecord))) { isAppScheduling_ = false; return PARAM_CHECK_ERROR; } @@ -458,7 +442,7 @@ int32_t AbilityRecordManager::TerminateAbility(uint16_t token, const Want* want) return PARAM_NULL_ERROR; } - if (!IsPermanentAbility(*topRecord)) { + if (!AbilityList::IsPermanentAbility(*topRecord)) { topRecord->isTerminated = true; abilityList_.Add(topRecord); } else { @@ -542,42 +526,9 @@ int32_t AbilityRecordManager::TerminateAll(const char *excludedBundleName) return AddAbilityOperation(TERMINATE_ALL, &want, 0); } isAppScheduling_ = true; - AbilityRecord *homeRecord = abilityList_.Get(MAIN_BUNDLE_NAME); - if (homeRecord == nullptr) { - return PARAM_CHECK_ERROR; - } - AbilityRecord *topRecord = abilityList_.GetTopAbility(); - abilityList_.PopAbility(); - if (excludedBundleName == nullptr || strcmp(excludedBundleName, MAIN_BUNDLE_NAME) == 0 - || strcmp(excludedBundleName, topRecord->appName) == 0) { - excludedBundleName = nullptr; - } - - AbilityRecord *excludedRecord = nullptr; - while (abilityList_.Size() > 0) { - AbilityRecord *record = abilityList_.GetTopAbility(); - abilityList_.PopAbility(); - if (record == nullptr) { - continue; - } - if (strcmp(record->appName, MAIN_BUNDLE_NAME) == 0) { - continue; - } - if (excludedBundleName != nullptr && strcmp(record->appName, excludedBundleName) == 0) { - excludedRecord = record; - continue; - } - DeleteAbilityThread(record); - AbilityRecordObserverManager::GetInstance().NotifyAbilityRecordCleanup(record->appName); - delete record; - } - abilityList_.Add(excludedRecord); - abilityList_.Add(homeRecord); - if (topRecord != homeRecord) { - abilityList_.Add(topRecord); - } + int32_t ret = abilityList_.PopAllAbility(excludedBundleName); isAppScheduling_ = false; - return ERR_OK; + return ret; } int32_t AbilityRecordManager::ForceStop(const Want *want) @@ -786,11 +737,9 @@ void AbilityRecordManager::DeleteRecordInfo(uint16_t token) if (record == nullptr) { return; } - if (token != LAUNCHER_TOKEN) { - DeleteAbilityThread(record); - // record app info event when stop app - RecordAbiityInfoEvt(record->GetAppName()); - } + DeleteAbilityThread(record); + // record app info event when stop app + RecordAbiityInfoEvt(record->GetAppName()); abilityList_.Erase(token); AbilityRecordObserverManager::GetInstance().NotifyAbilityRecordCleanup(record->appName); delete record; @@ -823,9 +772,9 @@ void AbilityRecordManager::OnForegroundDone(uint16_t token) } HILOG_INFO(HILOG_MODULE_AAFWK, "The number of tasks in the stack is %{public}u.", abilityList_.Size()); +#ifndef _MINI_MULTI_TASKS_ // the launcher foreground if (token == LAUNCHER_TOKEN) { -#ifndef _MINI_MULTI_TASKS_ if (nativeAbility_ == nullptr || nativeAbility_->GetState() != SLITE_STATE_FOREGROUND) { HILOG_ERROR(HILOG_MODULE_AAFWK, "native ability is in wrong state : %{public}d", nativeAbility_->GetState()); @@ -849,8 +798,8 @@ void AbilityRecordManager::OnForegroundDone(uint16_t token) } } return; -#endif } +#endif // _MINI_MULTI_TASKS_ // the js app active if (topRecord->token == token) { @@ -898,14 +847,6 @@ void AbilityRecordManager::OnBackgroundDone(uint16_t token) return; } - if (token == LAUNCHER_TOKEN) { - if (GetCleanAbilityDataFlag()) { - HILOG_INFO(HILOG_MODULE_AAFWK, "OnBackgroundDone clean launcher record data"); - record->SetWantData(nullptr, 0); - SetCleanAbilityDataFlag(false); - } - } - if ((!record->isTerminated) && (record->abilitySavedData == nullptr)) { record->abilitySavedData = new AbilitySavedData(); } diff --git a/services/abilitymgr_lite/src/slite/ability_record_observer_manager.cpp b/services/abilitymgr_lite/src/slite/ability_record_observer_manager.cpp index aff4774..6a52259 100644 --- a/services/abilitymgr_lite/src/slite/ability_record_observer_manager.cpp +++ b/services/abilitymgr_lite/src/slite/ability_record_observer_manager.cpp @@ -61,4 +61,4 @@ void AbilityRecordObserverManager::NotifyAbilityRecordCleanup(char *appName) } } } // namespace AbilitySlite -} // namespace OHOS \ No newline at end of file +} // namespace OHOS diff --git a/services/abilitymgr_lite/src/slite/ability_thread.cpp b/services/abilitymgr_lite/src/slite/ability_thread.cpp index 34f27d1..351dfaf 100644 --- a/services/abilitymgr_lite/src/slite/ability_thread.cpp +++ b/services/abilitymgr_lite/src/slite/ability_thread.cpp @@ -18,6 +18,7 @@ #include "abilityms_log.h" #include "ability_errors.h" #include "ability_inner_message.h" +#include "adapter.h" namespace OHOS { namespace AbilitySlite { @@ -102,11 +103,21 @@ int32_t AbilityThread::HandleDestroy() int32_t AbilityThread::SendScheduleMsgToAbilityThread(SliteAbilityInnerMsg &innerMsg) { - osStatus_t ret = osMessageQueuePut(GetMessageQueueId(), static_cast(&innerMsg), 0, 0); - if (ret != osOK) { - return IPC_REQUEST_ERROR; + constexpr uint32_t maxRetryTimes = 5; + + uint32_t retryTimes = 0; + while (retryTimes < maxRetryTimes) { + osStatus_t ret = osMessageQueuePut(GetMessageQueueId(), static_cast(&innerMsg), 0, 0); + if (ret == osOK) { + return ERR_OK; + } + HILOG_WARN(HILOG_MODULE_AAFWK, "AbilityThread osMessageQueuePut failed with %{public}d", ret); + osDelay(200); // sleep 200ms + retryTimes++; } - return ERR_OK; + + HILOG_ERROR(HILOG_MODULE_AAFWK, "AbilityThread SendScheduleMsgToAbilityThread failed."); + return IPC_REQUEST_ERROR; } } // namespace AbilitySlite } // namespace OHOS -- Gitee