From c724d889a06b07bb11a8ca5b75806cb68618ccc1 Mon Sep 17 00:00:00 2001 From: y00576111 Date: Tue, 15 Mar 2022 12:58:29 +0800 Subject: [PATCH] ark native reference modify use reference to release c memory in napi_wrap interface issue:https://gitee.com/openharmony/js_worker_module/issues/I4WJQD Signed-off-by: y00576111 Change-Id: I2c0899554c975a3e2e754f4abcdf67201369b746 --- native_engine/impl/ark/ark_native_engine.cpp | 2 +- .../impl/ark/ark_native_reference.cpp | 31 +++++++++++++++++-- native_engine/impl/ark/ark_native_reference.h | 11 +++++-- .../ark/native_value/ark_native_object.cpp | 30 +++++------------- 4 files changed, 45 insertions(+), 29 deletions(-) diff --git a/native_engine/impl/ark/ark_native_engine.cpp b/native_engine/impl/ark/ark_native_engine.cpp index 558fd29..eee23c0 100755 --- a/native_engine/impl/ark/ark_native_engine.cpp +++ b/native_engine/impl/ark/ark_native_engine.cpp @@ -540,7 +540,7 @@ NativeValue* ArkNativeEngine::CreateInstance(NativeValue* constructor, NativeVal NativeReference* ArkNativeEngine::CreateReference(NativeValue* value, uint32_t initialRefcount, NativeFinalize callback, void* data, void* hint) { - return new ArkNativeReference(this, value, initialRefcount); + return new ArkNativeReference(this, value, initialRefcount, false); } bool ArkNativeEngine::Throw(NativeValue* error) diff --git a/native_engine/impl/ark/ark_native_reference.cpp b/native_engine/impl/ark/ark_native_reference.cpp index a74fdbe..a12bf82 100644 --- a/native_engine/impl/ark/ark_native_reference.cpp +++ b/native_engine/impl/ark/ark_native_reference.cpp @@ -23,11 +23,20 @@ #include "utils/log.h" -ArkNativeReference::ArkNativeReference(ArkNativeEngine* engine, NativeValue* value, uint32_t initialRefcount, - NativeFinalize callback, void* data, void* hint) +ArkNativeReference::ArkNativeReference(ArkNativeEngine* engine, + NativeValue* value, + uint32_t initialRefcount, + bool deleteSelf, + NativeFinalize callback, + void* data, + void* hint) : engine_(engine), value_(Global(engine->GetEcmaVm(), JSValueRef::Undefined(engine->GetEcmaVm()))), - refCount_(initialRefcount), callback_(callback), data_(data), hint_(hint) + refCount_(initialRefcount), + deleteSelf_(deleteSelf), + callback_(callback), + data_(data), + hint_(hint) { Global oldValue = *value; auto vm = engine->GetEcmaVm(); @@ -40,10 +49,21 @@ ArkNativeReference::ArkNativeReference(ArkNativeEngine* engine, NativeValue* val #ifdef ENABLE_CONTAINER_SCOPE scopeId_ = OHOS::Ace::ContainerScope::CurrentId(); #endif + + if (deleteSelf) { + NativeReferenceManager* referenceManager = engine->GetReferenceManager(); + if (referenceManager != nullptr) { + referenceManager->CreateHandler(this); + } + } } ArkNativeReference::~ArkNativeReference() { + if (deleteSelf_ && engine_->GetReferenceManager()) { + engine_->GetReferenceManager()->ReleaseHandler(this); + } + if (!value_.IsWeak()) { value_.SetWeak(); } @@ -89,6 +109,11 @@ ArkNativeReference::operator NativeValue*() return Get(); } +void* ArkNativeReference::GetData() +{ + return data_; +} + void ArkNativeReference::FinalizeCallback() { if (callback_ != nullptr) { diff --git a/native_engine/impl/ark/ark_native_reference.h b/native_engine/impl/ark/ark_native_reference.h index 40ab0fd..8bbb0c6 100644 --- a/native_engine/impl/ark/ark_native_reference.h +++ b/native_engine/impl/ark/ark_native_reference.h @@ -28,19 +28,26 @@ using panda::Local; class ArkNativeReference : public NativeReference { public: - ArkNativeReference(ArkNativeEngine* engine, NativeValue* value, uint32_t initialRefcount, - NativeFinalize callback = nullptr, void* data = nullptr, void* hint = nullptr); + ArkNativeReference(ArkNativeEngine* engine, + NativeValue* value, + uint32_t initialRefcount, + bool deleteSelf, + NativeFinalize callback = nullptr, + void* data = nullptr, + void* hint = nullptr); ~ArkNativeReference() override; uint32_t Ref() override; uint32_t Unref() override; NativeValue* Get() override; + void* GetData() override; operator NativeValue*() override; private: ArkNativeEngine* engine_; Global value_; uint32_t refCount_; + bool deleteSelf_; #ifdef ENABLE_CONTAINER_SCOPE int32_t scopeId_ = -1; diff --git a/native_engine/impl/ark/native_value/ark_native_object.cpp b/native_engine/impl/ark/native_value/ark_native_object.cpp index defd3b1..529c9de 100644 --- a/native_engine/impl/ark/native_value/ark_native_object.cpp +++ b/native_engine/impl/ark/native_value/ark_native_object.cpp @@ -56,33 +56,16 @@ void ArkNativeObject::SetNativePointer(void* pointer, NativeFinalize cb, void* h Local key = StringRef::NewFromUtf8(vm, "_napiwrapper"); if (value->Has(vm, key) && pointer == nullptr) { Local wrapper = value->Get(vm, key); - auto oldInfo = reinterpret_cast(wrapper->GetNativePointerField(0)); + auto ref = reinterpret_cast(wrapper->GetNativePointerField(0)); // Try to remove native pointer from ArrayDataList wrapper->SetNativePointerField(0, nullptr, nullptr, nullptr); value->Delete(vm, key); - delete oldInfo; + delete ref; } else { - NativeObjectInfo* objInfo = NativeObjectInfo::CreateNewInstance(); - objInfo->engine = engine_; - objInfo->nativeObject = pointer; - objInfo->callback = cb; - objInfo->hint = hint; - Local object = ObjectRef::New(vm); + ArkNativeReference* ref = new ArkNativeReference(engine_, this, 1, true, cb, pointer, hint); object->SetNativePointerFieldCount(1); - object->SetNativePointerField(0, objInfo, - [](void* data, void* info) { - auto externalInfo = reinterpret_cast(data); - auto engine = externalInfo->engine; - auto nativeObject = externalInfo->nativeObject; - auto callback = externalInfo->callback; - auto hint = externalInfo->hint; - if (callback != nullptr) { - callback(engine, nativeObject, hint); - } - delete externalInfo; - }, - nullptr); + object->SetNativePointerField(0, ref, nullptr, nullptr); value->Set(vm, key, object); } } @@ -97,9 +80,10 @@ void* ArkNativeObject::GetNativePointer() void* result = nullptr; if (val->IsObject()) { Local ext(val); - result = ext->GetNativePointerField(0); + auto ref = reinterpret_cast(ext->GetNativePointerField(0)); + result = ref->GetData(); } - return (result != nullptr) ? reinterpret_cast(result)->nativeObject : nullptr; + return result; } NativeValue* ArkNativeObject::GetPropertyNames()