From 58774c3300570017557aade20f2526ae70ee9910 Mon Sep 17 00:00:00 2001 From: fangJinliang1 Date: Wed, 18 May 2022 16:43:16 +0800 Subject: [PATCH] fixed 0a20311 from https://gitee.com/fangJinliang1/notification_ans_standard/pulls/439 crash modify Signed-off-by: fangJinliang1 Change-Id: Ifda253bb48514abc16d0b76b267addcc309b4184 Signed-off-by: fangJinliang1 --- .../core/common/include/ans_inner_errors.h | 2 +- .../ans/native/src/notification_request.cpp | 2 +- interfaces/kits/napi/ans/include/subscribe.h | 17 ++++------ interfaces/kits/napi/ans/src/subscribe.cpp | 33 ++++++++++++------- interfaces/kits/napi/ans/src/unsubscribe.cpp | 7 ++-- 5 files changed, 32 insertions(+), 29 deletions(-) diff --git a/frameworks/ans/core/common/include/ans_inner_errors.h b/frameworks/ans/core/common/include/ans_inner_errors.h index 7600c5917..c4f88bcc4 100644 --- a/frameworks/ans/core/common/include/ans_inner_errors.h +++ b/frameworks/ans/core/common/include/ans_inner_errors.h @@ -74,7 +74,7 @@ enum ErrorCode : uint32_t { ERR_ANS_DISTRIBUTED_GET_INFO_FAILED, ERR_ANS_NOTIFICATION_IS_UNALLOWED_REMOVEALLOWED, ERR_ANS_GET_ACTIVE_USER_FAILED, - ERR_ANS_SUBSCRIBER_ALREADY_DELETE, + ERR_ANS_SUBSCRIBER_IS_DELETING, ERR_ANS_PREFERENCES_NOTIFICATION_SLOT_ENABLED, }; } // namespace Notification diff --git a/frameworks/ans/native/src/notification_request.cpp b/frameworks/ans/native/src/notification_request.cpp index 6dcb0fded..145535209 100644 --- a/frameworks/ans/native/src/notification_request.cpp +++ b/frameworks/ans/native/src/notification_request.cpp @@ -1638,7 +1638,7 @@ void NotificationRequest::ConvertJsonToNum(NotificationRequest *target, const nl } if (jsonObject.find("creatorUid") != jsonEnd) { - target->creatorUid_ = jsonObject.at("creatorUid").get(); + target->creatorUid_ = static_cast(jsonObject.at("creatorUid").get()); } if (jsonObject.find("creatorPid") != jsonEnd) { diff --git a/interfaces/kits/napi/ans/include/subscribe.h b/interfaces/kits/napi/ans/include/subscribe.h index c06a54602..a579aecdd 100644 --- a/interfaces/kits/napi/ans/include/subscribe.h +++ b/interfaces/kits/napi/ans/include/subscribe.h @@ -110,14 +110,6 @@ public: */ void SetCallbackInfo(const napi_env &env, const std::string &type, const napi_ref &ref); - /** - * @brief Sets the object deleting status. - * - * @param status Indicates the deleting status. - * @return Returns true if success, returns false otherwise - */ - bool SetObjectDeleting(bool status); - private: void SetCancelCallbackInfo(const napi_env &env, const napi_ref &ref); @@ -152,9 +144,6 @@ private: CallbackInfo disturbModeCallbackInfo_; CallbackInfo disturbDateCallbackInfo_; CallbackInfo enabledNotificationCallbackInfo_; - - std::mutex delMutex_; - bool isDelete_ = false; }; struct SubscriberInstancesInfo { @@ -165,10 +154,16 @@ struct SubscriberInstancesInfo { static std::mutex mutex_; static thread_local std::vector subscriberInstances_; +static std::mutex delMutex_; +static std::vector DeletingSubscriber; + bool HasNotificationSubscriber(const napi_env &env, const napi_value &value, SubscriberInstancesInfo &subscriberInfo); bool AddSubscriberInstancesInfo(const napi_env &env, const SubscriberInstancesInfo &subscriberInfo); bool DelSubscriberInstancesInfo(const napi_env &env, SubscriberInstance *subscriber); +bool AddDeletingSubscriber(SubscriberInstance *subscriber); +void DelDeletingSubscriber(SubscriberInstance *subscriber); + napi_value Subscribe(napi_env env, napi_callback_info info); } // namespace NotificationNapi } // namespace OHOS diff --git a/interfaces/kits/napi/ans/src/subscribe.cpp b/interfaces/kits/napi/ans/src/subscribe.cpp index 05a0fc856..818232e2d 100644 --- a/interfaces/kits/napi/ans/src/subscribe.cpp +++ b/interfaces/kits/napi/ans/src/subscribe.cpp @@ -851,17 +851,6 @@ void SubscriberInstance::SetDisturbDateCallbackInfo(const napi_env &env, const n disturbDateCallbackInfo_.ref = ref; } -bool SubscriberInstance::SetObjectDeleting(bool status) -{ - std::lock_guard lock(delMutex_); - if (isDelete_ && isDelete_ == status) { - return false; - } else { - isDelete_ = status; - return true; - } -} - void SubscriberInstance::SetCallbackInfo(const napi_env &env, const std::string &type, const napi_ref &ref) { if (type == CONSUME) { @@ -1081,6 +1070,7 @@ bool DelSubscriberInstancesInfo(const napi_env &env, SubscriberInstance *subscri if ((*it).ref != nullptr) { napi_delete_reference(env, (*it).ref); } + DelDeletingSubscriber((*it).subscriber); delete (*it).subscriber; (*it).subscriber = nullptr; subscriberInstances_.erase(it); @@ -1248,5 +1238,26 @@ napi_value Subscribe(napi_env env, napi_callback_info info) return promise; } } + +bool AddDeletingSubscriber(SubscriberInstance *subscriber) +{ + std::lock_guard lock(delMutex_); + auto iter = std::find(DeletingSubscriber.begin(), DeletingSubscriber.end(), subscriber); + if (iter != DeletingSubscriber.end()) { + return false; + } + + DeletingSubscriber.push_back(subscriber); + return true; +} + +void DelDeletingSubscriber(SubscriberInstance *subscriber) +{ + std::lock_guard lock(delMutex_); + auto iter = std::find(DeletingSubscriber.begin(), DeletingSubscriber.end(), subscriber); + if (iter != DeletingSubscriber.end()) { + DeletingSubscriber.erase(iter); + } +} } // namespace NotificationNapi } // namespace OHOS \ No newline at end of file diff --git a/interfaces/kits/napi/ans/src/unsubscribe.cpp b/interfaces/kits/napi/ans/src/unsubscribe.cpp index 9bd006a38..9714b0c3e 100644 --- a/interfaces/kits/napi/ans/src/unsubscribe.cpp +++ b/interfaces/kits/napi/ans/src/unsubscribe.cpp @@ -100,15 +100,12 @@ napi_value Unsubscribe(napi_env env, napi_callback_info info) return; } - bool ret = asynccallbackinfo->objectInfo->SetObjectDeleting(true); + bool ret = AddDeletingSubscriber(asynccallbackinfo->objectInfo); if (ret) { asynccallbackinfo->info.errorCode = NotificationHelper::UnSubscribeNotification(*(asynccallbackinfo->objectInfo)); - if (asynccallbackinfo->info.errorCode != ERR_OK) { - asynccallbackinfo->objectInfo->SetObjectDeleting(false); - } } else { - asynccallbackinfo->info.errorCode = ERR_ANS_SUBSCRIBER_ALREADY_DELETE; + asynccallbackinfo->info.errorCode = ERR_ANS_SUBSCRIBER_IS_DELETING; } }, [](napi_env env, napi_status status, void *data) { -- Gitee