From dbbc85b8baa0605dc7691b22a45c0a22ce5122b2 Mon Sep 17 00:00:00 2001 From: wenkaisong Date: Tue, 11 Jul 2023 20:55:06 +0800 Subject: [PATCH] fix: make dslm service singleton Signed-off-by: wenkaisong --- services/sa/standard/dslm_service.cpp | 18 +++++++++++++++--- services/sa/standard/dslm_service.h | 8 +++++++- .../dslm_fuzz_test/dslm_fuzzer/dslm_fuzzer.cpp | 2 +- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/services/sa/standard/dslm_service.cpp b/services/sa/standard/dslm_service.cpp index ad0a940..f340613 100644 --- a/services/sa/standard/dslm_service.cpp +++ b/services/sa/standard/dslm_service.cpp @@ -29,9 +29,9 @@ namespace OHOS { namespace Security { namespace DeviceSecurityLevel { -REGISTER_SYSTEM_ABILITY_BY_ID(DslmService, DEVICE_SECURITY_LEVEL_MANAGER_SA_ID, true); +const bool REGISTER_RESULT = SystemAbility::MakeAndRegisterAbility(DslmService::GetInstance().GetRefPtr()); -DslmService::DslmService(int32_t saId, bool runOnCreate) : SystemAbility(saId, runOnCreate) +DslmService::DslmService() : SystemAbility(DEVICE_SECURITY_LEVEL_MANAGER_SA_ID, true) { SECURITY_LOG_INFO("object initialization"); } @@ -44,7 +44,7 @@ void DslmService::OnStart() if (InitService() == SUCCESS) { SECURITY_LOG_INFO("init service success"); } - if (!Publish(this)) { + if (!Publish(DslmService::GetInstance())) { SECURITY_LOG_ERROR("publish service failed"); } }); @@ -63,6 +63,18 @@ int32_t DslmService::Dump(int fd, const std::vector &args) return 0; } +sptr DslmService::GetInstance() +{ + if (!instance_) { + std::lock_guard lock(mutex_); + if (instance_ == nullptr) { + instance_ = new DslmService(); + } + } + + return instance_; +} + int32_t DslmService::OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option) { do { diff --git a/services/sa/standard/dslm_service.h b/services/sa/standard/dslm_service.h index e88a8b1..ecdc121 100644 --- a/services/sa/standard/dslm_service.h +++ b/services/sa/standard/dslm_service.h @@ -18,6 +18,9 @@ #include #include +#include +#include +#include #include #include @@ -37,14 +40,17 @@ class DslmService : public SystemAbility, public IRemoteStub &args) override; int32_t OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option) override; + static sptr GetInstance(); private: + static sptr instance_; + static std::mutex mutex_; int32_t ProcessGetDeviceSecurityLevel(MessageParcel &data, MessageParcel &reply); }; } // namespace DeviceSecurityLevel diff --git a/test/dslm_fuzz_test/dslm_fuzzer/dslm_fuzzer.cpp b/test/dslm_fuzz_test/dslm_fuzzer/dslm_fuzzer.cpp index f29fba0..c8d692e 100644 --- a/test/dslm_fuzz_test/dslm_fuzzer/dslm_fuzzer.cpp +++ b/test/dslm_fuzz_test/dslm_fuzzer/dslm_fuzzer.cpp @@ -31,7 +31,7 @@ namespace DeviceSecurityLevel { namespace { const uint8_t mockBuffer[DEVICE_ID_MAX_LEN] = {0}; -DslmService g_dslmService(DEVICE_SECURITY_LEVEL_MANAGER_SA_ID, true); +DslmService g_dslmService(); void OnPeerMsgReceivedFuzzer(Parcel &parcel) { -- Gitee