未验证 提交 7c1b0ee9 编写于 作者: O openharmony_ci 提交者: Gitee

!764 fix weak ref mem leak

Merge pull request !764 from 马根堂/master
......@@ -39,7 +39,7 @@ NAPIRemoteObjectHolder::NAPIRemoteObjectHolder(napi_env env, const std::u16strin
localInterfaceRef_(nullptr), attachCount_(1), jsObjectRef_(nullptr)
{
jsThreadId_ = std::this_thread::get_id();
// create weak ref, do not need to delete,
// create weak ref, need call napi_delete_reference to release memory,
// increase ref count when the JS object will transfer to another thread or process.
napi_create_reference(env, thisVar, 0, &jsObjectRef_);
......@@ -58,6 +58,47 @@ NAPIRemoteObjectHolder::~NAPIRemoteObjectHolder()
ZLOGE(LOG_LABEL, "remove cleanup hook failed");
}
}
if (localInterfaceRef_ != nullptr) {
napi_status napiStatus = napi_delete_reference(env_, localInterfaceRef_);
if (napiStatus != napi_ok) {
ZLOGE(LOG_LABEL, "failed to delete ref");
}
}
if (jsObjectRef_ != nullptr && env_ != nullptr) {
if (jsThreadId_ == std::this_thread::get_id()) {
napi_status napiStatus = napi_delete_reference(env_, jsObjectRef_);
if (napiStatus != napi_ok) {
ZLOGE(LOG_LABEL, "failed to delete ref");
}
} else {
uv_loop_s *loop = nullptr;
napi_get_uv_event_loop(env_, &loop);
uv_work_t *work = new(std::nothrow) uv_work_t;
if (work == nullptr) {
ZLOGE(LOG_LABEL, "failed to new work");
return;
}
OperateJsRefParam *param = new OperateJsRefParam {
.env = env_,
.thisVarRef = jsObjectRef_
};
work->data = reinterpret_cast<void *>(param);
uv_queue_work(loop, work, [](uv_work_t *work) {}, [](uv_work_t *work, int status) {
OperateJsRefParam *param = reinterpret_cast<OperateJsRefParam *>(work->data);
napi_handle_scope scope = nullptr;
napi_open_handle_scope(param->env, &scope);
napi_status napiStatus = napi_delete_reference(param->env, param->thisVarRef);
if (napiStatus != napi_ok) {
ZLOGE(LOG_LABEL, "failed to delete ref on uv work");
}
napi_close_handle_scope(param->env, scope);
delete param;
delete work;
});
}
}
}
sptr<IRemoteObject> NAPIRemoteObjectHolder::Get()
......@@ -116,6 +157,9 @@ void NAPIRemoteObjectHolder::attachLocalInterface(napi_value localInterface, std
ZLOGE(LOG_LABEL, "Js env has been destructed");
return;
}
if (localInterfaceRef_ != nullptr) {
napi_delete_reference(env_, localInterfaceRef_);
}
napi_create_reference(env_, localInterface, 0, &localInterfaceRef_);
descriptor_ = Str8ToStr16(descriptor);
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册