From 9695c5b3755a2dcdcb6f45865972be98e0f2c1e2 Mon Sep 17 00:00:00 2001 From: fengjq Date: Wed, 10 Sep 2025 12:17:08 +0800 Subject: [PATCH] Add tryclean interface Signed-off-by: fengjq --- .../include/download_callback_middle_ani.h | 3 +- .../include/register_callback_manager_ani.h | 4 +++ .../src/cloud_download_ani.cpp | 1 + .../src/cloud_file_cache_ani.cpp | 1 + .../src/download_callback_middle_ani.cpp | 12 +++++++ .../src/register_callback_manager_ani.cpp | 32 ++++++++++++++++++- .../cloudfilesync/cloud_file_cache_napi.cpp | 1 + .../kits/js/cloudfilesync/cloud_file_napi.cpp | 1 + .../download_callback_middle_napi.cpp | 12 +++++++ .../download_callback_middle_napi.h | 3 +- .../register_callback_manager_napi.cpp | 25 +++++++++++++-- .../register_callback_manager_napi.h | 4 +++ 12 files changed, 94 insertions(+), 5 deletions(-) diff --git a/interfaces/kits/js/ani/file_cloud_sync/include/download_callback_middle_ani.h b/interfaces/kits/js/ani/file_cloud_sync/include/download_callback_middle_ani.h index 95cb07e9d..5de35db52 100644 --- a/interfaces/kits/js/ani/file_cloud_sync/include/download_callback_middle_ani.h +++ b/interfaces/kits/js/ani/file_cloud_sync/include/download_callback_middle_ani.h @@ -31,9 +31,10 @@ class CloudDlCallbackMiddleAni : public CloudDownloadCallback, public RegisterCallbackManagerAni, public std::enable_shared_from_this { public: - virtual ~CloudDlCallbackMiddleAni() = default; + ~CloudDlCallbackMiddleAni() override = default; void OnDownloadProcess(const DownloadProgressObj &progress) override; void RemoveDownloadInfo(int64_t downloadId); + void TryCleanCallback(); protected: std::vector GetDownloadIdsByUri(const std::string &uri); diff --git a/interfaces/kits/js/ani/file_cloud_sync/include/register_callback_manager_ani.h b/interfaces/kits/js/ani/file_cloud_sync/include/register_callback_manager_ani.h index 109db2704..b25919e24 100644 --- a/interfaces/kits/js/ani/file_cloud_sync/include/register_callback_manager_ani.h +++ b/interfaces/kits/js/ani/file_cloud_sync/include/register_callback_manager_ani.h @@ -32,6 +32,10 @@ public: void OnJsCallback(ani_env *env, ani_object value, uint32_t argc); ani_env *GetEnv(); void DetachEnv(); + virtual ~RegisterCallbackManagerAni(); + +protected: + void CleanAllCallback(bool force); protected: ani_vm *vm_{nullptr}; diff --git a/interfaces/kits/js/ani/file_cloud_sync/src/cloud_download_ani.cpp b/interfaces/kits/js/ani/file_cloud_sync/src/cloud_download_ani.cpp index ac26f622f..9de13f75d 100644 --- a/interfaces/kits/js/ani/file_cloud_sync/src/cloud_download_ani.cpp +++ b/interfaces/kits/js/ani/file_cloud_sync/src/cloud_download_ani.cpp @@ -167,6 +167,7 @@ void CloudDownloadAni::DownloadOff0(ani_env *env, ani_object object, ani_string ErrorHandler::Throw(env, JsErrCode::E_IPCSS); return; } + callbackImpl->TryCleanCallback(); } void CloudDownloadAni::DownloadOff1(ani_env *env, ani_object object, ani_string evt) diff --git a/interfaces/kits/js/ani/file_cloud_sync/src/cloud_file_cache_ani.cpp b/interfaces/kits/js/ani/file_cloud_sync/src/cloud_file_cache_ani.cpp index ed76c0598..edb257fba 100644 --- a/interfaces/kits/js/ani/file_cloud_sync/src/cloud_file_cache_ani.cpp +++ b/interfaces/kits/js/ani/file_cloud_sync/src/cloud_file_cache_ani.cpp @@ -148,6 +148,7 @@ void CloudFileCacheAni::CloudFileCacheOff0(ani_env *env, ani_object object, ani_ ErrorHandler::Throw(env, JsErrCode::E_IPCSS); return; } + callbackImpl->TryCleanCallback(); } void CloudFileCacheAni::CloudFileCacheOff1(ani_env *env, ani_object object, ani_string evt) diff --git a/interfaces/kits/js/ani/file_cloud_sync/src/download_callback_middle_ani.cpp b/interfaces/kits/js/ani/file_cloud_sync/src/download_callback_middle_ani.cpp index 06e6362eb..8eb816af3 100644 --- a/interfaces/kits/js/ani/file_cloud_sync/src/download_callback_middle_ani.cpp +++ b/interfaces/kits/js/ani/file_cloud_sync/src/download_callback_middle_ani.cpp @@ -97,4 +97,16 @@ void CloudDlCallbackMiddleAni::OnDownloadProcess(const DownloadProgressObj &prog LOGE("failed to send event"); } } + +void CloudDlCallbackMiddleAni::TryCleanCallback() +{ + bool noTask = false; + { + std::lock_guard lock(downloadInfoMtx_); + noTask = (downloadInfos_.size() == 0); + } + if (noTask) { + CleanAllCallback(false); + } +} } // namespace OHOS::FileManagement::CloudSync \ No newline at end of file diff --git a/interfaces/kits/js/ani/file_cloud_sync/src/register_callback_manager_ani.cpp b/interfaces/kits/js/ani/file_cloud_sync/src/register_callback_manager_ani.cpp index 7b1dae0e8..7f3ab975d 100644 --- a/interfaces/kits/js/ani/file_cloud_sync/src/register_callback_manager_ani.cpp +++ b/interfaces/kits/js/ani/file_cloud_sync/src/register_callback_manager_ani.cpp @@ -54,7 +54,7 @@ ani_status RegisterCallbackManagerAni::RegisterCallback(ani_env *env, ani_object ani_status RegisterCallbackManagerAni::UnregisterCallback(ani_env *env, ani_object callback) { - if (validRefNum_ == 0) { + if (validRefNum_.load() == 0) { return ANI_OK; } std::lock_guard lock(callbackMtx_); @@ -163,4 +163,34 @@ void RegisterCallbackManagerAni::DetachEnv() LOGE("detach current env failed, err: %{private}d", ret); } } + +RegisterCallbackManagerAni::~RegisterCallbackManagerAni() +{ + CleanAllCallback(true); +} + +void RegisterCallbackManagerAni::CleanAllCallback(bool force) +{ + std::lock_guard lock(callbackMtx_); + if (!force) { + if (validRefNum_.load() != 0) { + return; + } + } + ani_env *env = GetEnv(); + if (env != nullptr) { + for (auto &iter : callbackList_) { + env->GlobalReference_Delete(iter.second); + } + } else { + LOGE("Failed to delete reference before clean callback"); + } + if (callbackList_.size() != 0) { + DetachEnv(); + } + + callbackList_.clear(); + validRefNum_ = 0; + LOGI("Clean all callback, valid callback count is 0"); +} } // namespace OHOS::FileManagement::CloudSync \ No newline at end of file diff --git a/interfaces/kits/js/cloudfilesync/cloud_file_cache_napi.cpp b/interfaces/kits/js/cloudfilesync/cloud_file_cache_napi.cpp index b3f80f7fd..9f2c50177 100644 --- a/interfaces/kits/js/cloudfilesync/cloud_file_cache_napi.cpp +++ b/interfaces/kits/js/cloudfilesync/cloud_file_cache_napi.cpp @@ -560,6 +560,7 @@ napi_value CloudFileCacheNapi::Off(napi_env env, napi_callback_info info) NError(JsErrCode::E_INNER_FAILED).ThrowErr(env); return nullptr; } + callbackImpl->TryCleanCallback(); return NVal::CreateUndefined(env).val_; } diff --git a/interfaces/kits/js/cloudfilesync/cloud_file_napi.cpp b/interfaces/kits/js/cloudfilesync/cloud_file_napi.cpp index cd5c1a3ed..a4a344e4f 100644 --- a/interfaces/kits/js/cloudfilesync/cloud_file_napi.cpp +++ b/interfaces/kits/js/cloudfilesync/cloud_file_napi.cpp @@ -232,6 +232,7 @@ napi_value CloudFileDownloadNapi::Off(napi_env env, napi_callback_info info) NError(JsErrCode::E_IPCSS).ThrowErr(env); return nullptr; } + callbackImpl->TryCleanCallback(); return NVal::CreateUndefined(env).val_; } diff --git a/interfaces/kits/js/cloudfilesync/download_callback_middle_napi.cpp b/interfaces/kits/js/cloudfilesync/download_callback_middle_napi.cpp index 13623fb2e..535c3d548 100644 --- a/interfaces/kits/js/cloudfilesync/download_callback_middle_napi.cpp +++ b/interfaces/kits/js/cloudfilesync/download_callback_middle_napi.cpp @@ -94,4 +94,16 @@ void CloudDlCallbackMiddleNapi::OnDownloadProcess(const DownloadProgressObj &pro LOGE("Failed to execute libuv work queue, status: %{public}d", status); } } + +void CloudDlCallbackMiddleNapi::TryCleanCallback() +{ + bool noTask = false; + { + std::lock_guard lock(downloadInfoMtx_); + noTask = (downloadInfos_.size() == 0); + } + if (noTask) { + CleanAllCallback(false); + } +} } // namespace OHOS::FileManagement::CloudSync \ No newline at end of file diff --git a/interfaces/kits/js/cloudfilesync/download_callback_middle_napi.h b/interfaces/kits/js/cloudfilesync/download_callback_middle_napi.h index 2937215a1..045642060 100644 --- a/interfaces/kits/js/cloudfilesync/download_callback_middle_napi.h +++ b/interfaces/kits/js/cloudfilesync/download_callback_middle_napi.h @@ -32,9 +32,10 @@ class CloudDlCallbackMiddleNapi : public CloudDownloadCallback, public std::enable_shared_from_this { public: explicit CloudDlCallbackMiddleNapi(napi_env env) : RegisterCallbackManagerNapi(env) {} - virtual ~CloudDlCallbackMiddleNapi() = default; + ~CloudDlCallbackMiddleNapi() override = default; void OnDownloadProcess(const DownloadProgressObj &progress) override; void RemoveDownloadInfo(int64_t downloadId); + void TryCleanCallback(); protected: virtual void DownloadProgressInner(std::shared_ptr progress){}; diff --git a/interfaces/kits/js/cloudfilesync/register_callback_manager_napi.cpp b/interfaces/kits/js/cloudfilesync/register_callback_manager_napi.cpp index fb86d6261..8b90bd6bb 100644 --- a/interfaces/kits/js/cloudfilesync/register_callback_manager_napi.cpp +++ b/interfaces/kits/js/cloudfilesync/register_callback_manager_napi.cpp @@ -44,7 +44,7 @@ napi_status RegisterCallbackManagerNapi::RegisterCallback(napi_value callback) napi_status RegisterCallbackManagerNapi::UnregisterCallback(napi_value callback) { - if (validRefNum_ == 0) { + if (validRefNum_.load() == 0) { return napi_ok; } std::lock_guard lock(callbackMtx_); @@ -80,7 +80,6 @@ napi_status RegisterCallbackManagerNapi::UnregisterCallback(napi_value callback) } LOGI("After unregister, callback list size: %{public}zu, validRefNum_=%{public}d", callbackList_.size(), validRefNum_.load()); - return napi_ok; } @@ -132,4 +131,26 @@ void RegisterCallbackManagerNapi::OnJsCallback(napi_value *value, uint32_t argc) iter++; } } + +RegisterCallbackManagerNapi::~RegisterCallbackManagerNapi() +{ + CleanAllCallback(true); +} + +void RegisterCallbackManagerNapi::CleanAllCallback(bool force) +{ + std::lock_guard lock(callbackMtx_); + if (!force) { + if (validRefNum_.load() != 0) { + return; + } + } + + for (auto &iter : callbackList_) { + napi_delete_reference(env_, iter.second); + } + callbackList_.clear(); + validRefNum_ = 0; + LOGI("Clean all callback, valid callback count is 0"); +} } // namespace OHOS::FileManagement::CloudSync \ No newline at end of file diff --git a/interfaces/kits/js/cloudfilesync/register_callback_manager_napi.h b/interfaces/kits/js/cloudfilesync/register_callback_manager_napi.h index 1c1df12e0..ef17923a9 100644 --- a/interfaces/kits/js/cloudfilesync/register_callback_manager_napi.h +++ b/interfaces/kits/js/cloudfilesync/register_callback_manager_napi.h @@ -30,6 +30,10 @@ public: napi_status RegisterCallback(napi_value callback); napi_status UnregisterCallback(napi_value callback); void OnJsCallback(napi_value *value, uint32_t argc); + virtual ~RegisterCallbackManagerNapi(); + +protected: + void CleanAllCallback(bool force); protected: napi_env env_; -- Gitee