From d879155e1086babc21f873d155799d077aec7b67 Mon Sep 17 00:00:00 2001 From: zhaoyuan Date: Thu, 30 Sep 2021 00:08:57 +0000 Subject: [PATCH] fixed 0d4609b from https://gitee.com/master_zy/aafwk_standard/pulls/117 fix Subscription Message Signed-off-by: zhaoyuan --- .../napi_data_ability_helper.cpp | 43 +++++++++---------- .../inner/napi_common/napi_common_ability.cpp | 4 +- .../inner/napi_common/napi_common_ability.h | 2 +- services/dataobsmgr/src/dataobs_mgr_inner.cpp | 18 +++++--- 4 files changed, 36 insertions(+), 31 deletions(-) diff --git a/interfaces/kits/napi/aafwk/featureAbility/napi_data_ability_helper.cpp b/interfaces/kits/napi/aafwk/featureAbility/napi_data_ability_helper.cpp index 8bc0572b92a..8a03cbf613e 100644 --- a/interfaces/kits/napi/aafwk/featureAbility/napi_data_ability_helper.cpp +++ b/interfaces/kits/napi/aafwk/featureAbility/napi_data_ability_helper.cpp @@ -27,7 +27,7 @@ #include "data_ability_result.h" #include "data_ability_operation.h" #include "napi_data_ability_operation.h" - +#include "../inner/napi_common/napi_common_ability.h" #include "message_parcel.h" using namespace OHOS::AAFwk; @@ -35,7 +35,6 @@ using namespace OHOS::AppExecFwk; namespace OHOS { namespace AppExecFwk { -extern napi_value g_dataAbilityHelper; std::list> g_dataAbilityHelperList; /** @@ -74,7 +73,7 @@ napi_value DataAbilityHelperInit(napi_env env, napi_value exports) nullptr, sizeof(properties) / sizeof(*properties), properties, - &g_dataAbilityHelper)); + &GetGlobalDataAbilityHelper())); g_dataAbilityHelperList.clear(); return exports; } @@ -689,11 +688,6 @@ napi_value RegisterWrap(napi_env env, napi_callback_info info, DAHelperOnOffCB * HILOG_INFO("DataAbilityHelper objectInfo = %{public}p", objectInfo); onCB->dataAbilityHelper = objectInfo; - sptr observer(new (std::nothrow) NAPIDataAbilityObserver()); - onCB->observer = observer; - - registerInstances_.emplace_back(onCB); - HILOG_INFO("regInstances_ emplace_back size = %{public}zu", registerInstances_.size()); ret = RegisterAsync(env, args, argcAsync, argcPromise, onCB); return ret; } @@ -712,9 +706,15 @@ napi_value RegisterAsync( napi_valuetype valuetype = napi_undefined; NAPI_CALL(env, napi_typeof(env, args[argcPromise], &valuetype)); if (valuetype == napi_function) { + HILOG_INFO(" valuetype is napi_function"); NAPI_CALL(env, napi_create_reference(env, args[argcPromise], 1, &onCB->cbBase.cbInfo.callback)); + } else { + HILOG_INFO(" not valuetype isn't napi_function"); } + sptr observer(new (std::nothrow) NAPIDataAbilityObserver()); + onCB->observer = observer; + NAPI_CALL(env, napi_create_async_work( env, @@ -725,8 +725,8 @@ napi_value RegisterAsync( HILOG_INFO("NAPI_Register, main event thread complete."); DAHelperOnOffCB *onCB = static_cast(data); if (onCB != nullptr) { - delete onCB; - onCB = nullptr; + registerInstances_.emplace_back(onCB); + HILOG_INFO("regInstances_ emplace_back size = %{public}zu", registerInstances_.size()); } }, (void *)onCB, @@ -901,15 +901,19 @@ void UnRegisterCompleteCB(napi_env env, napi_status status, void *data) if (offCB->cbBase.cbInfo.callback != nullptr) { HILOG_INFO("NAPI_UnRegister, callback is not null."); // if match callback ,or match both callback and uri - napi_ref callback = offCB->cbBase.cbInfo.callback; + napi_value callbackA = 0; + napi_get_reference_value(offCB->cbBase.cbInfo.env, offCB->cbBase.cbInfo.callback, &callbackA); do { auto helper = std::find_if( - registerInstances_.begin(), registerInstances_.end(), [callback](const DAHelperOnOffCB *helper) { + registerInstances_.begin(), registerInstances_.end(), [callbackA](const DAHelperOnOffCB *helper) { bool result = false; - napi_value callbackA = 0; + if (helper == nullptr || helper->cbBase.cbInfo.callback == nullptr) { + HILOG_ERROR("UnRegisterCompleteCB %{public}s is nullptr", + helper == nullptr ? "helper" : "helper->cbBase.cbInfo.callback"); + return result; + } napi_value callbackB = 0; - napi_get_reference_value(helper->cbBase.cbInfo.env, callback, &callbackA); - napi_get_reference_value(helper->cbBase.cbInfo.env, helper->cbBase.cbInfo.callback, &callbackA); + napi_get_reference_value(helper->cbBase.cbInfo.env, helper->cbBase.cbInfo.callback, &callbackB); auto ret = napi_strict_equals(helper->cbBase.cbInfo.env, callbackA, callbackB, &result); HILOG_INFO("NAPI_UnRegister cb equals status=%{public}d result=%{public}d.", ret, result); return result; @@ -920,9 +924,9 @@ void UnRegisterCompleteCB(napi_env env, napi_status status, void *data) if (offCB->uri == uri.ToString()) { // match callback, or match both callback and uri (*helper)->dataAbilityHelper->UnregisterObserver(uri, (*helper)->observer); - registerInstances_.erase(helper); delete *helper; *helper = nullptr; + registerInstances_.erase(helper); HILOG_INFO("NAPI_UnRegister Instances erase size = %{public}zu", registerInstances_.size()); } else { HILOG_INFO("NAPI_UnRegister uri=%{public}s,helper.Uri=%{public}s", @@ -947,9 +951,9 @@ void UnRegisterCompleteCB(napi_env env, napi_status status, void *data) // match uri OHOS::Uri uri((*helper)->uri); (*helper)->dataAbilityHelper->UnregisterObserver(uri, (*helper)->observer); - registerInstances_.erase(helper); delete *helper; *helper = nullptr; + registerInstances_.erase(helper); HILOG_INFO("NAPI_UnRegister Instances erase size = %{public}zu", registerInstances_.size()); } else { HILOG_INFO("NAPI_UnRegister not match any uri."); @@ -1016,17 +1020,12 @@ void NAPIDataAbilityObserver::OnChange() DAHelperOnOffCB *onCB = (DAHelperOnOffCB *)work->data; napi_value result[ARGS_TWO] = {0}; result[PARAM0] = GetCallbackErrorValue(onCB->cbBase.cbInfo.env, NO_ERROR); - napi_value callback = 0; napi_value undefined = 0; napi_get_undefined(onCB->cbBase.cbInfo.env, &undefined); napi_value callResult = 0; napi_get_reference_value(onCB->cbBase.cbInfo.env, onCB->cbBase.cbInfo.callback, &callback); - napi_call_function(onCB->cbBase.cbInfo.env, undefined, callback, ARGS_TWO, &result[PARAM0], &callResult); - if (onCB->cbBase.cbInfo.callback != nullptr) { - napi_delete_reference(onCB->cbBase.cbInfo.env, onCB->cbBase.cbInfo.callback); - } if (onCB != nullptr) { delete onCB; onCB = nullptr; diff --git a/interfaces/kits/napi/aafwk/inner/napi_common/napi_common_ability.cpp b/interfaces/kits/napi/aafwk/inner/napi_common/napi_common_ability.cpp index d70985df33c..a8daab08525 100755 --- a/interfaces/kits/napi/aafwk/inner/napi_common/napi_common_ability.cpp +++ b/interfaces/kits/napi/aafwk/inner/napi_common/napi_common_ability.cpp @@ -33,7 +33,7 @@ napi_value *GetGlobalClassContext(void) return &g_classContext; } -napi_value GetGlobalDataAbilityHelper(void) +napi_value &GetGlobalDataAbilityHelper(void) { return g_dataAbilityHelper; } @@ -3433,7 +3433,7 @@ napi_value AcquireDataAbilityHelperWrap(napi_env env, napi_callback_info info, D } napi_value result = nullptr; - NAPI_CALL(env, napi_new_instance(env, g_dataAbilityHelper, 1, &args[PARAM0], &result)); + NAPI_CALL(env, napi_new_instance(env, GetGlobalDataAbilityHelper(), 1, &args[PARAM0], &result)); delete dataAbilityHelperCB; dataAbilityHelperCB = nullptr; HILOG_INFO("%{public}s,end", __func__); diff --git a/interfaces/kits/napi/aafwk/inner/napi_common/napi_common_ability.h b/interfaces/kits/napi/aafwk/inner/napi_common/napi_common_ability.h index eb2b4b7268f..b21e28d5a68 100755 --- a/interfaces/kits/napi/aafwk/inner/napi_common/napi_common_ability.h +++ b/interfaces/kits/napi/aafwk/inner/napi_common/napi_common_ability.h @@ -25,7 +25,7 @@ namespace AppExecFwk { const std::int32_t STR_MAX_SIZE = 128; napi_value *GetGlobalClassContext(void); -napi_value GetGlobalDataAbilityHelper(void); +napi_value &GetGlobalDataAbilityHelper(void); void SaveAppInfo(AppInfo_ &appInfo, const ApplicationInfo &appInfoOrg); napi_value WrapAppInfo(napi_env env, const AppInfo_ &appInfo); diff --git a/services/dataobsmgr/src/dataobs_mgr_inner.cpp b/services/dataobsmgr/src/dataobs_mgr_inner.cpp index 5826ca8884a..840b6d17460 100644 --- a/services/dataobsmgr/src/dataobs_mgr_inner.cpp +++ b/services/dataobsmgr/src/dataobs_mgr_inner.cpp @@ -79,21 +79,27 @@ int DataObsMgrInner::HandleUnregisterObserver(const Uri &uri, const sptrAsObject() == dataObserver->AsObject()) { + break; + } + } if (obs == obslist.end()) { AtomicSubTaskCount(); HILOG_ERROR("DataObsMgrInner::HandleUnregisterObserver the obs is not registered to the uri."); return NO_OBS_FOR_URI; } - - obslist.remove(dataObserver); + sptr removeObs = *obs; + obslist.remove(removeObs); obsmap_.erase(uri.ToString()); if (!obslist.empty()) { obsmap_.emplace(uri.ToString(), obslist); } - if (!ObsExistInMap(dataObserver)) { - RemoveObsDeathRecipient(dataObserver); + if (!ObsExistInMap(removeObs)) { + RemoveObsDeathRecipient(removeObs); } AtomicSubTaskCount(); @@ -120,7 +126,7 @@ int DataObsMgrInner::HandleNotifyChange(const Uri &uri) } AtomicSubTaskCount(); - HILOG_INFO("DataObsMgrInner::HandleNotifyChange called end"); + HILOG_INFO("DataObsMgrInner::HandleNotifyChange called end %{public}zu", obslist.size()); return NO_ERROR; } -- Gitee