From 69f6cfc2555f61e2d1c4b99abd52b8b47970fdff Mon Sep 17 00:00:00 2001 From: zhrenqiang Date: Sat, 5 Jul 2025 15:15:24 +0800 Subject: [PATCH] add MemMgr SetCritical Change-Id: Iff81dfd205f0cc6695875a8285a60f7a77aeda59 Signed-off-by: zhrenqiang --- bundle.json | 1 + services/dbms/BUILD.gn | 1 + services/dbms/include/distributed_bms_host.h | 4 ++ services/dbms/src/distributed_bms.cpp | 8 ++++ services/dbms/src/distributed_bms_host.cpp | 47 +++++++++++++++---- .../unittest/dbms_services_kit_test/BUILD.gn | 1 + .../distributed_bms_host_test/BUILD.gn | 1 + .../distributed_bms_host_test.cpp | 19 ++++++++ .../distributedbmshost_fuzzer/BUILD.gn | 1 + 9 files changed, 75 insertions(+), 8 deletions(-) diff --git a/bundle.json b/bundle.json index dc6e473..8fedeec 100644 --- a/bundle.json +++ b/bundle.json @@ -33,6 +33,7 @@ "i18n", "ipc", "image_framework", + "memmgr", "napi", "os_account", "resource_management", diff --git a/services/dbms/BUILD.gn b/services/dbms/BUILD.gn index 42e77e7..fa84bd5 100644 --- a/services/dbms/BUILD.gn +++ b/services/dbms/BUILD.gn @@ -76,6 +76,7 @@ ohos_shared_library("libdbms") { "init:libbegetutil", "ipc:ipc_core", "kv_store:distributeddata_inner", + "memmgr:memmgrclient", "resource_management:global_resmgr", "safwk:system_ability_fwk", "samgr:samgr_proxy", diff --git a/services/dbms/include/distributed_bms_host.h b/services/dbms/include/distributed_bms_host.h index 47c5273..6e2e434 100644 --- a/services/dbms/include/distributed_bms_host.h +++ b/services/dbms/include/distributed_bms_host.h @@ -41,6 +41,10 @@ private: bool GetParcelableInfos(Parcel &data, std::vector &parcelableInfos); template bool WriteParcelableVector(std::vector &parcelableVector, Parcel &data); + void SetCritical(bool critical); + + std::mutex mutex_; + int32_t counter_ = 0; }; } // namespace AppExecFwk } // namespace OHOS diff --git a/services/dbms/src/distributed_bms.cpp b/services/dbms/src/distributed_bms.cpp index 98029b2..56756c8 100644 --- a/services/dbms/src/distributed_bms.cpp +++ b/services/dbms/src/distributed_bms.cpp @@ -32,6 +32,7 @@ #include "locale_config.h" #include "locale_info.h" #include "image_compress.h" +#include "mem_mgr_client.h" #ifdef DISTRIBUTED_BUNDLE_IMAGE_ENABLE #include "image_packer.h" #include "image_source.h" @@ -67,6 +68,9 @@ namespace { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' }; const std::string POSTFIX = "_Compress."; + constexpr uint8_t SA_SERVICE = 1; + constexpr uint8_t SA_START = 1; + constexpr uint8_t SA_DIED = 0; #ifdef HISYSEVENT_ENABLE DBMSEventInfo GetEventInfo( const std::vector &elements, const std::string &localeInfo, int32_t resultCode) @@ -130,6 +134,8 @@ void DistributedBms::OnStart() if (!res) { APP_LOGE("DistributedBms: OnStart failed"); } + Memory::MemMgrClient::GetInstance().NotifyProcessStatus( + getpid(), SA_SERVICE, SA_START, DISTRIBUTED_BUNDLE_MGR_SERVICE_SYS_ABILITY_ID); APP_LOGI("DistributedBms: OnStart end"); } @@ -139,6 +145,8 @@ void DistributedBms::OnStop() if (distributedSub_ != nullptr) { EventFwk::CommonEventManager::UnSubscribeCommonEvent(distributedSub_); } + Memory::MemMgrClient::GetInstance().NotifyProcessStatus( + getpid(), SA_SERVICE, SA_DIED, DISTRIBUTED_BUNDLE_MGR_SERVICE_SYS_ABILITY_ID); } void DistributedBms::Init() diff --git a/services/dbms/src/distributed_bms_host.cpp b/services/dbms/src/distributed_bms_host.cpp index dada2a7..8a9a03f 100644 --- a/services/dbms/src/distributed_bms_host.cpp +++ b/services/dbms/src/distributed_bms_host.cpp @@ -21,7 +21,9 @@ #include "bundle_memory_guard.h" #include "dbms_scope_guard.h" #include "distributed_bundle_ipc_interface_code.h" +#include "mem_mgr_client.h" #include "remote_ability_info.h" +#include "system_ability_definition.h" namespace OHOS { namespace AppExecFwk { @@ -39,6 +41,25 @@ DistributedBmsHost::~DistributedBmsHost() APP_LOGI("DistributedBmsHost instance is destroyed"); } +void DistributedBmsHost::SetCritical(bool critical) +{ + std::lock_guard lock(mutex_); + APP_LOGD("critical: %{public}d, %{public}d", critical, counter_); + if (critical) { + counter_++; + if (counter_ == 1) { + Memory::MemMgrClient::GetInstance().SetCritical( + getpid(), critical, DISTRIBUTED_BUNDLE_MGR_SERVICE_SYS_ABILITY_ID); + } + } else { + counter_--; + if (counter_ == 0) { + Memory::MemMgrClient::GetInstance().SetCritical( + getpid(), critical, DISTRIBUTED_BUNDLE_MGR_SERVICE_SYS_ABILITY_ID); + } + } +} + int DistributedBmsHost::OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option) { BundleMemoryGuard memoryGuard; @@ -50,28 +71,38 @@ int DistributedBmsHost::OnRemoteRequest(uint32_t code, MessageParcel &data, Mess APP_LOGE("verify interface token failed"); return ERR_INVALID_STATE; } + SetCritical(true); + int result = NO_ERROR; switch (code) { case static_cast(DistributedInterfaceCode::GET_REMOTE_ABILITY_INFO): case static_cast(DistributedInterfaceCode::GET_REMOTE_ABILITY_INFO_WITH_LOCALE): - return HandleGetRemoteAbilityInfo(data, reply); + result = HandleGetRemoteAbilityInfo(data, reply); + break; case static_cast(DistributedInterfaceCode::GET_REMOTE_ABILITY_INFOS): case static_cast(DistributedInterfaceCode::GET_REMOTE_ABILITY_INFOS_WITH_LOCALE): - return HandleGetRemoteAbilityInfos(data, reply); + result = HandleGetRemoteAbilityInfos(data, reply); + break; case static_cast(DistributedInterfaceCode::GET_ABILITY_INFO): case static_cast(DistributedInterfaceCode::GET_ABILITY_INFO_WITH_LOCALE): - return HandleGetAbilityInfo(data, reply); + result = HandleGetAbilityInfo(data, reply); + break; case static_cast(DistributedInterfaceCode::GET_ABILITY_INFOS): case static_cast(DistributedInterfaceCode::GET_ABILITY_INFOS_WITH_LOCALE): - return HandleGetAbilityInfos(data, reply); + result = HandleGetAbilityInfos(data, reply); + break; case static_cast(DistributedInterfaceCode::GET_DISTRIBUTED_BUNDLE_INFO): - return HandleGetDistributedBundleInfo(data, reply); + result = HandleGetDistributedBundleInfo(data, reply); + break; case static_cast(DistributedInterfaceCode::GET_DISTRIBUTED_BUNDLE_NAME): - return HandleGetDistributedBundleName(data, reply); + result = HandleGetDistributedBundleName(data, reply); + break; default: APP_LOGW("DistributedBmsHost receives unknown code, code = %{public}d", code); - return IPCObjectStub::OnRemoteRequest(code, data, reply, option); + result = IPCObjectStub::OnRemoteRequest(code, data, reply, option); + break; } - return NO_ERROR; + SetCritical(false); + return result; } int DistributedBmsHost::HandleGetRemoteAbilityInfo(Parcel &data, Parcel &reply) diff --git a/services/dbms/test/unittest/dbms_services_kit_test/BUILD.gn b/services/dbms/test/unittest/dbms_services_kit_test/BUILD.gn index 5940363..d7eb718 100644 --- a/services/dbms/test/unittest/dbms_services_kit_test/BUILD.gn +++ b/services/dbms/test/unittest/dbms_services_kit_test/BUILD.gn @@ -65,6 +65,7 @@ ohos_unittest("DbmsServicesKitTest") { "init:libbegetutil", "ipc:ipc_core", "kv_store:distributeddata_inner", + "memmgr:memmgrclient", "resource_management:global_resmgr", "safwk:system_ability_fwk", "samgr:samgr_proxy", diff --git a/services/dbms/test/unittest/distributed_bms_host_test/BUILD.gn b/services/dbms/test/unittest/distributed_bms_host_test/BUILD.gn index 94d5253..6c207b5 100644 --- a/services/dbms/test/unittest/distributed_bms_host_test/BUILD.gn +++ b/services/dbms/test/unittest/distributed_bms_host_test/BUILD.gn @@ -51,6 +51,7 @@ ohos_unittest("DistributedBmsHostTest") { "init:libbegetutil", "ipc:ipc_core", "kv_store:distributeddata_inner", + "memmgr:memmgrclient", "resource_management:global_resmgr", "safwk:system_ability_fwk", "samgr:samgr_proxy", diff --git a/services/dbms/test/unittest/distributed_bms_host_test/distributed_bms_host_test.cpp b/services/dbms/test/unittest/distributed_bms_host_test/distributed_bms_host_test.cpp index 2518d98..56fd752 100644 --- a/services/dbms/test/unittest/distributed_bms_host_test/distributed_bms_host_test.cpp +++ b/services/dbms/test/unittest/distributed_bms_host_test/distributed_bms_host_test.cpp @@ -726,4 +726,23 @@ HWTEST_F(DistributedBmsHostTest, GetParcelableInfos_0100, Function | MediumTest int res = host.GetParcelableInfos(data, vector); EXPECT_TRUE(res); } + +/** + * @tc.number: SetCritical_0100 + * @tc.name: test SetCritical_0100 + * @tc.desc: SetCritical_0100 + */ +HWTEST_F(DistributedBmsHostTest, SetCritical_0100, Function | SmallTest | Level1) +{ + DistributedBmsHost host; + EXPECT_EQ(host.counter_, 0); + host.SetCritical(true); + EXPECT_EQ(host.counter_, 1); + host.SetCritical(true); + EXPECT_EQ(host.counter_, 2); + host.SetCritical(false); + EXPECT_EQ(host.counter_, 1); + host.SetCritical(false); + EXPECT_EQ(host.counter_, 0); +} } \ No newline at end of file diff --git a/test/fuzztest/distributedbmshost_fuzzer/BUILD.gn b/test/fuzztest/distributedbmshost_fuzzer/BUILD.gn index 107262b..09b35b4 100644 --- a/test/fuzztest/distributedbmshost_fuzzer/BUILD.gn +++ b/test/fuzztest/distributedbmshost_fuzzer/BUILD.gn @@ -43,5 +43,6 @@ ohos_fuzztest("DistributedBmsHostFuzzTest") { "c_utils:utils", "hilog:libhilog", "ipc:ipc_core", + "memmgr:memmgrclient", ] } -- Gitee