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 6fb5146687ac9553de41bf525595d28770345415..69114c7226f5c7af7d3f627d7331a846687b48ed 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 402a8600481f04ea221d0cddc7f02efb28e25e8e..8670ba492d8166720a59ef16c89069a2502da616 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 8fc3bfd098c41d506769fc0a55ea2246fa5beef5..eca6444a2503690b3ce1dac298a4a187022339aa 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 d56a00ce9a9a65bf2ddbc82f9a46edf8b4c6b95d..33ae5fac2b0e6b95039e7706306167447133f360 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