修复多线程使用ImageBitmap crash的问题

Signed-off-by: chenyuchi <chenyuchi2@huawei.com>
This commit is contained in:
chenyuchi 2024-07-22 14:07:07 +00:00
parent 6dd6ee74d5
commit b5fd61f362
2 changed files with 19 additions and 3 deletions

View File

@ -63,7 +63,7 @@ napi_value AttachImageBitmap(napi_env env, void* value, void*)
LOGW("Invalid parameter.");
return nullptr;
}
auto image = (JSRenderImage*)value;
auto* image = (JSRenderImage*)value;
if (image == nullptr) {
LOGW("Invalid context.");
return nullptr;
@ -83,6 +83,7 @@ napi_value AttachImageBitmap(napi_env env, void* value, void*)
napi_coerce_to_native_binding_object(env, imageBitmap, DetachImageBitmap, AttachImageBitmap, value, nullptr);
napi_wrap_with_size(env, imageBitmap, value, JSRenderImage::Finalizer, nullptr, nullptr, image->GetBindingSize());
image->AddNativeRef();
return imageBitmap;
}
@ -92,8 +93,7 @@ void JSRenderImage::Finalizer(napi_env env, void* data, void* hint)
{
auto wrapper = reinterpret_cast<JSRenderImage*>(data);
if (wrapper) {
delete wrapper;
wrapper = nullptr;
wrapper->Release();
}
}
@ -108,6 +108,7 @@ napi_value JSRenderImage::Constructor(napi_env env, napi_callback_info info)
if (argc <= 0) {
napi_coerce_to_native_binding_object(env, thisVar, DetachImageBitmap, AttachImageBitmap, wrapper, nullptr);
napi_wrap(env, thisVar, wrapper, Finalizer, nullptr, nullptr);
wrapper->AddNativeRef();
return thisVar;
}
napi_value argv[2] = { nullptr };
@ -145,6 +146,7 @@ napi_value JSRenderImage::Constructor(napi_env env, napi_callback_info info)
}
napi_coerce_to_native_binding_object(env, thisVar, DetachImageBitmap, AttachImageBitmap, wrapper, nullptr);
napi_wrap_with_size(env, thisVar, wrapper, Finalizer, nullptr, nullptr, wrapper->GetBindingSize());
wrapper->AddNativeRef();
return thisVar;
}

View File

@ -131,6 +131,19 @@ public:
return bindingSize_;
}
void AddNativeRef()
{
++nativeRefCount_;
}
void Release()
{
--nativeRefCount_;
if (nativeRefCount_ == 0) {
delete this;
}
}
ACE_DISALLOW_COPY_AND_MOVE(JSRenderImage);
private:
napi_value OnClose();
@ -168,6 +181,7 @@ private:
int32_t instanceId_ = 0;
CanvasUnit unit_ = CanvasUnit::DEFAULT;
size_t bindingSize_ = 0;
uint32_t nativeRefCount_ = 0;
};
} // namespace OHOS::Ace::Framework