From 474677d3dc7924bacbbeda099b0f1a555afc7908 Mon Sep 17 00:00:00 2001 From: wang19954 Date: Tue, 19 Aug 2025 21:10:18 +0800 Subject: [PATCH] IssueNo:#ICTONQ Description:fix resoruce bug Sig:SIG_ApplicaitonFramework Feature or Bugfix:Bugfix Binary Source:No Signed-off-by: wangtiantian --- .../bundle_resource/bundle_resource_manager.h | 4 +- .../bundle_resource_manager.cpp | 13 ++++++- .../bms_bundle_resource_test.cpp | 38 +++++++++++++++++++ 3 files changed, 52 insertions(+), 3 deletions(-) diff --git a/services/bundlemgr/include/bundle_resource/bundle_resource_manager.h b/services/bundlemgr/include/bundle_resource/bundle_resource_manager.h index dd12576b45..f304cb9993 100644 --- a/services/bundlemgr/include/bundle_resource/bundle_resource_manager.h +++ b/services/bundlemgr/include/bundle_resource/bundle_resource_manager.h @@ -164,8 +164,10 @@ private: void PrepareSysRes(); - std::atomic isInterrupted_ = false; + bool IsNeedInterrupted(const uint32_t tempTaskNumber, const BundleResourceChangeType type); + std::atomic_uint currentTaskNum_ = 0; + std::atomic_uint currentChangeType_ = 0; std::mutex mutex_; std::shared_ptr bundleResourceRdb_; std::shared_ptr bundleResourceIconRdb_; diff --git a/services/bundlemgr/src/bundle_resource/bundle_resource_manager.cpp b/services/bundlemgr/src/bundle_resource/bundle_resource_manager.cpp index 8b709cb609..b90bf771f8 100644 --- a/services/bundlemgr/src/bundle_resource/bundle_resource_manager.cpp +++ b/services/bundlemgr/src/bundle_resource/bundle_resource_manager.cpp @@ -797,6 +797,7 @@ bool BundleResourceManager::AddAllResourceInfo( EventReport::SendCpuSceneEvent(FOUNDATION_PROCESS_NAME, SCENE_ID_UPDATE_RESOURCE); ++currentTaskNum_; uint32_t tempTaskNum = currentTaskNum_; + currentChangeType_ = type; std::lock_guard guard(mutex_); APP_LOGI("bundle resource hold mutex"); std::map> resourceInfosMap; @@ -824,6 +825,14 @@ bool BundleResourceManager::AddAllResourceInfo( return true; } +bool BundleResourceManager::IsNeedInterrupted(const uint32_t tempTaskNumber, const BundleResourceChangeType type) +{ + if (tempTaskNumber == currentTaskNum_) { + return false; + } + return ((static_cast(currentChangeType_) & static_cast(type)) == static_cast(type)); +} + bool BundleResourceManager::AddResourceInfosWhenSystemLanguageChanged( std::map> &resourceInfosMap, const int32_t userId, const uint32_t tempTaskNumber) @@ -838,7 +847,7 @@ bool BundleResourceManager::AddResourceInfosWhenSystemLanguageChanged( threadPool->Start(MAX_TASK_NUMBER); threadPool->SetMaxTaskNum(MAX_TASK_NUMBER); for (const auto &item : resourceInfosMap) { - if (tempTaskNumber != currentTaskNum_) { + if (IsNeedInterrupted(tempTaskNumber, BundleResourceChangeType::SYSTEM_LANGUE_CHANGE)) { APP_LOGI("need stop current task, new first"); threadPool->Stop(); return false; @@ -941,7 +950,7 @@ bool BundleResourceManager::AddResourceInfosWhenSystemThemeChanged( threadPool->Start(MAX_TASK_NUMBER); threadPool->SetMaxTaskNum(MAX_TASK_NUMBER); for (const auto &item : resourceInfosMap) { - if (tempTaskNumber != currentTaskNum_) { + if (IsNeedInterrupted(tempTaskNumber, BundleResourceChangeType::SYSTEM_THEME_CHANGE)) { APP_LOGI("need stop current task, new first"); threadPool->Stop(); return false; diff --git a/services/bundlemgr/test/unittest/bms_bundle_resource_test/bms_bundle_resource_test.cpp b/services/bundlemgr/test/unittest/bms_bundle_resource_test/bms_bundle_resource_test.cpp index 3bbdf81ce8..050973783f 100644 --- a/services/bundlemgr/test/unittest/bms_bundle_resource_test/bms_bundle_resource_test.cpp +++ b/services/bundlemgr/test/unittest/bms_bundle_resource_test/bms_bundle_resource_test.cpp @@ -5581,9 +5581,14 @@ HWTEST_F(BmsBundleResourceTest, AddResourceInfosWhenSystemLanguageChanged_0010, ResourceInfo resourceInfo; resourceInfosMap[BUNDLE_NAME].push_back(resourceInfo); manager->currentTaskNum_ = 100; + manager->currentChangeType_ = static_cast(BundleResourceChangeType::SYSTEM_LANGUE_CHANGE); ret = manager->AddResourceInfosWhenSystemLanguageChanged(resourceInfosMap, USERID, 6000000); EXPECT_FALSE(ret); + manager->currentChangeType_ = static_cast(BundleResourceChangeType::SYSTEM_THEME_CHANGE); + ret = manager->AddResourceInfosWhenSystemLanguageChanged(resourceInfosMap, USERID, 6000000); + EXPECT_TRUE(ret); + ret = manager->AddResourceInfosWhenSystemLanguageChanged(resourceInfosMap, USERID, 100); EXPECT_TRUE(ret); } @@ -5638,9 +5643,14 @@ HWTEST_F(BmsBundleResourceTest, AddResourceInfosWhenSystemThemeChanged_0010, Fun ResourceInfo resourceInfo; resourceInfosMap[BUNDLE_NAME].push_back(resourceInfo); manager->currentTaskNum_ = 100; + manager->currentChangeType_ = static_cast(BundleResourceChangeType::SYSTEM_THEME_CHANGE); ret = manager->AddResourceInfosWhenSystemThemeChanged(resourceInfosMap, THEME_TEST_USERID, 1000000); EXPECT_FALSE(ret); + manager->currentChangeType_ = static_cast(BundleResourceChangeType::SYSTEM_LANGUE_CHANGE); + ret = manager->AddResourceInfosWhenSystemThemeChanged(resourceInfosMap, THEME_TEST_USERID, 1000000); + EXPECT_TRUE(ret); + ret = manager->AddResourceInfosWhenSystemThemeChanged(resourceInfosMap, THEME_TEST_USERID, 100); EXPECT_TRUE(ret); OHOS::ForceRemoveDirectory(THEME_BUNDLE_NAME_PATH); @@ -5938,4 +5948,32 @@ HWTEST_F(BmsBundleResourceTest, ProcessThemeAndDynamicIconWhenOta_0010, Function EXPECT_TRUE(ret); } } + +/** + * @tc.number: IsNeedInterrupted_0010 + * Function: IsNeedInterrupted + * @tc.name: test + * @tc.desc: 1. system running normally + * 2. test IsNeedInterrupted + */ +HWTEST_F(BmsBundleResourceTest, IsNeedInterrupted_0010, Function | SmallTest | Level0) +{ + auto manager = DelayedSingleton::GetInstance(); + EXPECT_NE(manager, nullptr); + if (manager != nullptr) { + manager->currentTaskNum_ = 100; + manager->currentChangeType_ = static_cast(BundleResourceChangeType::SYSTEM_LANGUE_CHANGE); + bool ret = manager->IsNeedInterrupted(manager->currentTaskNum_, + BundleResourceChangeType::SYSTEM_LANGUE_CHANGE); + EXPECT_FALSE(ret); + + ret = manager->IsNeedInterrupted(manager->currentTaskNum_ + 100, + BundleResourceChangeType::SYSTEM_LANGUE_CHANGE); + EXPECT_TRUE(ret); + + ret = manager->IsNeedInterrupted(manager->currentTaskNum_ + 100, + BundleResourceChangeType::SYSTEM_THEME_CHANGE); + EXPECT_FALSE(ret); + } +} } // OHOS -- Gitee