diff --git a/bundle.json b/bundle.json index dc6e473a79b532334c19c848aede0664e15c1ea4..8fedeecfcc17d3ccac13ee0a9bc7c9b7580de901 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 42e77e72114def262bd89b39c3badc08ecaf01dd..fa84bd5db4e77400d67bc260112138e6c58b65e6 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 47c5273538e5eb63bb924ed66514712fbecf41b3..6e2e434466d009a15c41897e01bfb524d8cd9b1e 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 98029b22e7819481a1489d50a48eb848ce58d912..56756c8355f65e5227fd7f59c81dc60417c610ed 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 dada2a738662e494893ed3c160f5b5cc4f2b1ac6..8a9a03ff643e329f982b54ea025c46c6fc5d272a 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 5940363cfa0fd0582a84bee5d831d76e669c548d..d7eb7186e40928f5860dc8313052ddeacab4c1e6 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 94d52532c212819ee40c31d7a664209fc2aa508c..6c207b584921a56011338687d1eee301b88201aa 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 2518d98780588abc1b5237ded8830dceb8519ff3..56fd752ca44387e7bcfd93fe73ab6d8d1c65ee6d 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 107262b5e906119fda201ef18c1d60f2373b203b..09b35b45b5e34609f0591c1fd90d535fb645102e 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", ] }