From 60d5ac39219ff55d3cbf170cc337742741e4e904 Mon Sep 17 00:00:00 2001 From: WDY Date: Mon, 11 Aug 2025 16:57:13 +0800 Subject: [PATCH] solve download callback deadlock Signed-off-by: WDY --- .../src/download_callback_middle_ani.cpp | 14 +++++++------- .../download_callback_middle_napi.cpp | 16 ++++++++-------- 2 files changed, 15 insertions(+), 15 deletions(-) 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 26476c61b..f01c18e04 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 @@ -50,19 +50,19 @@ std::vector CloudDlCallbackMiddleAni::GetDownloadIdsByUri(const std::st void CloudDlCallbackMiddleAni::OnDownloadProcess(const DownloadProgressObj &progress) { - auto fileCacheInfo = GetDownloadInfo(progress.downloadId); - if (fileCacheInfo == nullptr) { - LOGE("Failed to callback, no such taskId: %{public}lld", static_cast(progress.downloadId)); - return; - } - fileCacheInfo->Update(progress); + // To avoid deadlocks with Drivekit, move progress updates to libuv callback thread. std::shared_ptr callbackImpl = shared_from_this(); - auto task = [fileCacheInfo, callbackImpl]() mutable { + auto task = [progress, callbackImpl]() mutable { if (fileCacheInfo == nullptr || callbackImpl == nullptr) { LOGE("Failed to callback, is callbackImpl null: %{public}d", (callbackImpl == nullptr)); return; } LOGI("CloudDlCallbackMiddleAni OnDownloadProcess for JS"); + auto fileCacheInfo = callbackImpl->GetDownloadInfo(progress.downloadId); + if (fileCacheInfo == nullptr) { + LOGE("Failed to callback, no such taskId: %{public}lld", static_cast(progress.downloadId)); + return; + } ani_env *tmpEnv = callbackImpl->GetEnv(); if (tmpEnv == nullptr) { LOGE("Failed to get env from vm"); diff --git a/interfaces/kits/js/cloudfilesync/download_callback_middle_napi.cpp b/interfaces/kits/js/cloudfilesync/download_callback_middle_napi.cpp index f632784a5..819378df6 100644 --- a/interfaces/kits/js/cloudfilesync/download_callback_middle_napi.cpp +++ b/interfaces/kits/js/cloudfilesync/download_callback_middle_napi.cpp @@ -48,20 +48,20 @@ std::vector CloudDlCallbackMiddleNapi::GetDownloadIdsByUri(const std::s void CloudDlCallbackMiddleNapi::OnDownloadProcess(const DownloadProgressObj &progress) { - auto fileCacheInfo = GetDownloadInfo(progress.downloadId); - if (fileCacheInfo == nullptr) { - LOGE("Failed to callback, no such taskId: %{public}lld", static_cast(progress.downloadId)); - return; - } - fileCacheInfo->Update(progress); + // To avoid deadlocks with Drivekit, move progress updates to libuv callback thread. std::shared_ptr callbackImpl = shared_from_this(); napi_status status = napi_send_event( callbackImpl->env_, - [fileCacheInfo, callbackImpl]() mutable { - if (fileCacheInfo == nullptr || callbackImpl == nullptr) { + [progress, callbackImpl]() mutable { + if (callbackImpl == nullptr) { LOGE("Failed to callback, is callbackImpl null: %{public}d", (callbackImpl == nullptr)); return; } + auto fileCacheInfo = callbackImpl->GetDownloadInfo(progress.downloadId); + if (fileCacheInfo == nullptr) { + LOGE("Failed to callback, no such taskId: %{public}lld", static_cast(progress.downloadId)); + return; + } napi_env tmpEnv = callbackImpl->env_; napi_handle_scope scope = nullptr; napi_status status = napi_open_handle_scope(tmpEnv, &scope); -- Gitee