From c1c9c57269ab1738d6fe815eb9d05c57eea7a4f2 Mon Sep 17 00:00:00 2001 From: zhouhongli2023 Date: Thu, 3 Aug 2023 14:53:46 +0800 Subject: [PATCH 1/2] crash Signed-off-by: zhouhongli2023 --- dataBusiness/calllog/src/calllog_ability.cpp | 5 ++- .../include/contacts_datashare_stub_impl.h | 16 +++++--- .../contacts/src/contacts_data_ability.cpp | 5 ++- .../src/contacts_datashare_stub_impl.cpp | 39 +++++++++++++------ .../voicemail/src/voicemail_ability.cpp | 5 ++- 5 files changed, 47 insertions(+), 23 deletions(-) diff --git a/dataBusiness/calllog/src/calllog_ability.cpp b/dataBusiness/calllog/src/calllog_ability.cpp index 85593a1..29adb37 100644 --- a/dataBusiness/calllog/src/calllog_ability.cpp +++ b/dataBusiness/calllog/src/calllog_ability.cpp @@ -56,12 +56,13 @@ sptr CallLogAbility::OnConnect(const AAFwk::Want &want) { HILOG_INFO("CallLogAbility %{public}s begin.", __func__); Extension::OnConnect(want); - sptr remoteObject = new (std::nothrow) DataShare::ContactsDataShareStubImpl( - std::static_pointer_cast(shared_from_this())); + sptr remoteObject = + new (std::nothrow) DataShare::ContactsDataShareStubImpl(); if (remoteObject == nullptr) { HILOG_ERROR("%{public}s No memory allocated for DataShareStubImpl", __func__); return nullptr; } + remoteObject->SetCalllogAbility(std::static_pointer_cast(shared_from_this())); HILOG_INFO("CallLogAbility %{public}s end.", __func__); return remoteObject->AsObject(); } diff --git a/dataBusiness/contacts/include/contacts_datashare_stub_impl.h b/dataBusiness/contacts/include/contacts_datashare_stub_impl.h index aff91f0..9c8fe06 100644 --- a/dataBusiness/contacts/include/contacts_datashare_stub_impl.h +++ b/dataBusiness/contacts/include/contacts_datashare_stub_impl.h @@ -23,8 +23,7 @@ namespace OHOS { namespace DataShare { class ContactsDataShareStubImpl : public DataShareStub { public: - explicit ContactsDataShareStubImpl(const std::shared_ptr& extension) - : contactsDataAbility_(extension) {}; + ContactsDataShareStubImpl() {} virtual ~ContactsDataShareStubImpl() {}; int Insert(const Uri &uri, const DataShareValuesBucket &value) override; @@ -45,6 +44,10 @@ public: Uri NormalizeUri(const Uri &uri) override; Uri DenormalizeUri(const Uri &uri) override; + void SetContactsDataAbility(std::shared_ptr extension); + void SetCallLogAbility(std::shared_ptr extension); + void SetVoiceMailAbility(std::shared_ptr extension); + private: std::shared_ptr GetOwner(const Uri &uri); std::shared_ptr GetContactsDataAbility(); @@ -52,9 +55,12 @@ private: std::shared_ptr GetVoiceMailAbility(); private: - std::shared_ptr contactsDataAbility_; - std::shared_ptr callLogAbility_; - std::shared_ptr voiceMailAbility_; + std::shared_ptr contactsDataAbility_ = nullptr; + std::shared_ptr callLogAbility_ = nullptr; + std::shared_ptr voiceMailAbility_ = nullptr; + std::mutex contactsMutex_; + std::mutex callogMutex_; + std::mutex voiceMailMutex_; }; } // namespace DataShare } // namespace OHOS diff --git a/dataBusiness/contacts/src/contacts_data_ability.cpp b/dataBusiness/contacts/src/contacts_data_ability.cpp index 039f86c..5c0801a 100644 --- a/dataBusiness/contacts/src/contacts_data_ability.cpp +++ b/dataBusiness/contacts/src/contacts_data_ability.cpp @@ -100,12 +100,13 @@ sptr ContactsDataAbility::OnConnect(const AAFwk::Want &want) { HILOG_INFO("ContactsDataAbility %{public}s begin.", __func__); Extension::OnConnect(want); - sptr remoteObject = new (std::nothrow) DataShare::ContactsDataShareStubImpl( - std::static_pointer_cast(shared_from_this())); + sptr remoteObject = + new (std::nothrow) DataShare::ContactsDataShareStubImpl(); if (remoteObject == nullptr) { HILOG_ERROR("%{public}s No memory allocated for DataShareStubImpl", __func__); return nullptr; } + remoteObject->SetContactsDataAbility(std::static_pointer_cast(shared_from_this())); HILOG_INFO("ContactsDataAbility %{public}s end.", __func__); return remoteObject->AsObject(); } diff --git a/dataBusiness/contacts/src/contacts_datashare_stub_impl.cpp b/dataBusiness/contacts/src/contacts_datashare_stub_impl.cpp index 1132c83..7b6cff3 100644 --- a/dataBusiness/contacts/src/contacts_datashare_stub_impl.cpp +++ b/dataBusiness/contacts/src/contacts_datashare_stub_impl.cpp @@ -24,13 +24,33 @@ namespace OHOS { namespace DataShare { using DataObsMgrClient = OHOS::AAFwk::DataObsMgrClient; +void SetContactsDataAbility(std::shared_ptr extension) +{ + std::lock_guard lock(contactsMutex_); + contactsDataAbility_ = extension; +} + +void SetCallLogAbility(std::shared_ptr extension) +{ + std::lock_guard lock(callogMutex_); + callLogAbility_ = extension; +} + +void SetVoiceMailAbility(std::shared_ptr extension) +{ + std::lock_guard lock(voiceMailMutex_); + voiceMailAbility_ = extension; +} + std::shared_ptr ContactsDataShareStubImpl::GetContactsDataAbility() { + std::lock_guard lock(contactsMutex_); return contactsDataAbility_; } std::shared_ptr ContactsDataShareStubImpl::GetCallLogAbility() { + std::lock_guard lock(callogMutex_); if (callLogAbility_ == nullptr) { callLogAbility_.reset(CallLogAbility::Create()); } @@ -39,6 +59,7 @@ std::shared_ptr ContactsDataShareStubImpl::GetCallLogAbilit std::shared_ptr ContactsDataShareStubImpl::GetVoiceMailAbility() { + std::lock_guard lock(voiceMailMutex_); if (voiceMailAbility_ == nullptr) { voiceMailAbility_.reset(VoiceMailAbility::Create()); } @@ -65,8 +86,7 @@ int ContactsDataShareStubImpl::Insert(const Uri &uri, const DataShareValuesBucke { HILOG_INFO("insert begin."); int ret = 0; - auto client = sptr(this); - auto extension = client->GetOwner(uri); + auto extension = GetOwner(uri); if (extension == nullptr) { HILOG_ERROR("insert failed, extension is null."); return ret; @@ -84,8 +104,7 @@ int ContactsDataShareStubImpl::Update(const Uri &uri, const DataSharePredicates { HILOG_INFO("update begin."); int ret = 0; - auto client = sptr(this); - auto extension = client->GetOwner(uri); + auto extension = GetOwner(uri); if (extension == nullptr) { HILOG_ERROR("update failed, extension is null."); return ret; @@ -102,8 +121,7 @@ int ContactsDataShareStubImpl::Delete(const Uri &uri, const DataSharePredicates { HILOG_INFO("delete begin."); int ret = 0; - auto client = sptr(this); - auto extension = client->GetOwner(uri); + auto extension = GetOwner(uri); if (extension == nullptr) { HILOG_ERROR("delete failed, extension is null."); return ret; @@ -120,14 +138,12 @@ std::shared_ptr ContactsDataShareStubImpl::Query(const Uri & const DataSharePredicates &predicates, std::vector &columns, DatashareBusinessError &businessError) { HILOG_INFO("query begin."); - std::shared_ptr resultSet = nullptr; - auto client = sptr(this); - auto extension = client->GetOwner(uri); + auto extension = GetOwner(uri); if (extension == nullptr) { HILOG_ERROR("query failed, extension is null."); return nullptr; } - resultSet = extension->Query(uri, predicates, columns, businessError); + auto resultSet = extension->Query(uri, predicates, columns, businessError); HILOG_INFO("query end successfully."); return resultSet; } @@ -136,8 +152,7 @@ int ContactsDataShareStubImpl::BatchInsert(const Uri &uri, const std::vector(this); - auto extension = client->GetOwner(uri); + auto extension = GetOwner(uri); if (extension == nullptr) { HILOG_ERROR("batch insert failed, extension is null."); return ret; diff --git a/dataBusiness/voicemail/src/voicemail_ability.cpp b/dataBusiness/voicemail/src/voicemail_ability.cpp index 4a5e416..80879fe 100644 --- a/dataBusiness/voicemail/src/voicemail_ability.cpp +++ b/dataBusiness/voicemail/src/voicemail_ability.cpp @@ -58,12 +58,13 @@ sptr VoiceMailAbility::OnConnect(const AAFwk::Want &want) { HILOG_INFO("VoiceMailAbility %{public}s begin.", __func__); Extension::OnConnect(want); - sptr remoteObject = new (std::nothrow) DataShare::ContactsDataShareStubImpl( - std::static_pointer_cast(shared_from_this())); + sptr remoteObject = + new (std::nothrow) DataShare::ContactsDataShareStubImpl(); if (remoteObject == nullptr) { HILOG_ERROR("%{public}s No memory allocated for DataShareStubImpl", __func__); return nullptr; } + remoteObject->SetVoiceMailAbility(std::static_pointer_cast(shared_from_this())); HILOG_INFO("VoiceMailAbility %{public}s end.", __func__); return remoteObject->AsObject(); } -- Gitee From b742af17db0fbbd521355e9257ee871e3195a32c Mon Sep 17 00:00:00 2001 From: zhouhongli2023 Date: Thu, 3 Aug 2023 15:44:49 +0800 Subject: [PATCH 2/2] update Signed-off-by: zhouhongli2023 --- dataBusiness/calllog/src/calllog_ability.cpp | 2 +- dataBusiness/contacts/src/contacts_datashare_stub_impl.cpp | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dataBusiness/calllog/src/calllog_ability.cpp b/dataBusiness/calllog/src/calllog_ability.cpp index 29adb37..b0ca396 100644 --- a/dataBusiness/calllog/src/calllog_ability.cpp +++ b/dataBusiness/calllog/src/calllog_ability.cpp @@ -62,7 +62,7 @@ sptr CallLogAbility::OnConnect(const AAFwk::Want &want) HILOG_ERROR("%{public}s No memory allocated for DataShareStubImpl", __func__); return nullptr; } - remoteObject->SetCalllogAbility(std::static_pointer_cast(shared_from_this())); + remoteObject->SetCallLogAbility(std::static_pointer_cast(shared_from_this())); HILOG_INFO("CallLogAbility %{public}s end.", __func__); return remoteObject->AsObject(); } diff --git a/dataBusiness/contacts/src/contacts_datashare_stub_impl.cpp b/dataBusiness/contacts/src/contacts_datashare_stub_impl.cpp index 7b6cff3..ba7b62e 100644 --- a/dataBusiness/contacts/src/contacts_datashare_stub_impl.cpp +++ b/dataBusiness/contacts/src/contacts_datashare_stub_impl.cpp @@ -24,19 +24,19 @@ namespace OHOS { namespace DataShare { using DataObsMgrClient = OHOS::AAFwk::DataObsMgrClient; -void SetContactsDataAbility(std::shared_ptr extension) +void ContactsDataShareStubImpl::SetContactsDataAbility(std::shared_ptr extension) { std::lock_guard lock(contactsMutex_); contactsDataAbility_ = extension; } -void SetCallLogAbility(std::shared_ptr extension) +void ContactsDataShareStubImpl::SetCallLogAbility(std::shared_ptr extension) { std::lock_guard lock(callogMutex_); callLogAbility_ = extension; } -void SetVoiceMailAbility(std::shared_ptr extension) +void ContactsDataShareStubImpl::SetVoiceMailAbility(std::shared_ptr extension) { std::lock_guard lock(voiceMailMutex_); voiceMailAbility_ = extension; -- Gitee