From 1f9b186ccd399c6d37fab0497e2f311f027d3833 Mon Sep 17 00:00:00 2001 From: l30052632 Date: Mon, 2 Dec 2024 14:51:21 +0800 Subject: [PATCH] cherry pick 903a35a from https://gitee.com/tlbl/filemanagement_file_api/pulls/871 cherry pick 8693861 from https://gitee.com/tlbl/filemanagement_file_api/pulls/865 add clean_ref method Signed-off-by: l30052632 --- .../include/n_async/n_async_work_callback.h | 1 + utils/filemgmt_libn/include/n_async/n_ref.h | 1 + .../src/n_async/n_async_work_callback.cpp | 18 ++++++++++++++++++ utils/filemgmt_libn/src/n_async/n_ref.cpp | 8 ++++++++ 4 files changed, 28 insertions(+) diff --git a/utils/filemgmt_libn/include/n_async/n_async_work_callback.h b/utils/filemgmt_libn/include/n_async/n_async_work_callback.h index 6fb514668..69114c722 100644 --- a/utils/filemgmt_libn/include/n_async/n_async_work_callback.h +++ b/utils/filemgmt_libn/include/n_async/n_async_work_callback.h @@ -28,6 +28,7 @@ public: NVal Schedule(std::string procedureName, NContextCBExec cbExec, NContextCBComplete cbComplete) final; void ThreadSafeSchedule(NContextCBComplete cbComplete); explicit operator bool() const; + void CleanRef(); private: NAsyncContextCallback *ctx_ = nullptr; diff --git a/utils/filemgmt_libn/include/n_async/n_ref.h b/utils/filemgmt_libn/include/n_async/n_ref.h index 402a86004..8670ba492 100644 --- a/utils/filemgmt_libn/include/n_async/n_ref.h +++ b/utils/filemgmt_libn/include/n_async/n_ref.h @@ -33,6 +33,7 @@ public: env_ = nullptr; ref_ = nullptr; } + void DeleteJsEnv(); private: napi_env env_ = nullptr; diff --git a/utils/filemgmt_libn/src/n_async/n_async_work_callback.cpp b/utils/filemgmt_libn/src/n_async/n_async_work_callback.cpp index 8fc3bfd09..eca6444a2 100644 --- a/utils/filemgmt_libn/src/n_async/n_async_work_callback.cpp +++ b/utils/filemgmt_libn/src/n_async/n_async_work_callback.cpp @@ -27,6 +27,19 @@ namespace FileManagement { namespace LibN { using namespace std; +void NAsyncWorkCallback::CleanRef() +{ + if (!ctx_) { + HILOGE("NAsyncWorkCallback ctx is nullptr"); + return; + } + if (!bool(ctx_->cb_)) { + HILOGE("NAsyncWorkCallback ref is nullptr"); + return; + } + ctx_->cb_.DeleteJsEnv(); +} + NAsyncWorkCallback::NAsyncWorkCallback(napi_env env, NVal thisPtr, NVal cb) : NAsyncWork(env) { ctx_ = new(std::nothrow) NAsyncContextCallback(thisPtr, cb); @@ -109,6 +122,11 @@ static void CallbackComplete(napi_env env, napi_status status, void *data) napi_value global = nullptr; napi_value callback = ctx->cb_.Deref(env).val_; + if (!bool(ctx->cb_)) { + HILOGE("failed to get ref."); + return; + } + napi_value tmp = nullptr; napi_get_global(env, &global); napi_status stat = napi_call_function(env, global, callback, argv.size(), argv.data(), &tmp); diff --git a/utils/filemgmt_libn/src/n_async/n_ref.cpp b/utils/filemgmt_libn/src/n_async/n_ref.cpp index d56a00ce9..33ae5fac2 100644 --- a/utils/filemgmt_libn/src/n_async/n_ref.cpp +++ b/utils/filemgmt_libn/src/n_async/n_ref.cpp @@ -50,6 +50,14 @@ NVal NRef::Deref(napi_env env) napi_get_reference_value(env, ref_, &val); return {env, val}; } + +void NRef::DeleteJsEnv() +{ + if (ref_ && env_) { + napi_delete_reference(env_, ref_); + } + ref_ = nullptr; +} } // namespace LibN } // namespace FileManagement } // namespace OHOS -- Gitee