From 40ce9c6de5458131bbd8bad358c101a8f1d81c28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E9=91=AB?= Date: Sat, 28 Dec 2024 16:18:39 +0800 Subject: [PATCH 1/3] =?UTF-8?q?uv=5Fqueue=5Fwork=E5=BC=82=E6=AD=A5?= =?UTF-8?q?=E8=B0=83=E7=94=A8=E6=95=B4=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 周鑫 --- .../class_tasksignal/task_signal_entity.cpp | 65 ++++++++----------- .../class_watcher/watcher_n_exporter.cpp | 14 ++-- .../js/src/mod_fs/properties/connectdfs.cpp | 15 ++--- .../kits/js/src/mod_fs/properties/copy.cpp | 10 +-- .../kits/js/src/mod_fs/properties/copy.h | 2 +- .../copy_listener/trans_listener.cpp | 50 ++++++++------ .../src/n_async/n_async_work_callback.cpp | 51 ++++----------- 7 files changed, 86 insertions(+), 121 deletions(-) diff --git a/interfaces/kits/js/src/mod_fs/class_tasksignal/task_signal_entity.cpp b/interfaces/kits/js/src/mod_fs/class_tasksignal/task_signal_entity.cpp index c11015496b..b6ea8f2f4b 100644 --- a/interfaces/kits/js/src/mod_fs/class_tasksignal/task_signal_entity.cpp +++ b/interfaces/kits/js/src/mod_fs/class_tasksignal/task_signal_entity.cpp @@ -27,46 +27,35 @@ void TaskSignalEntity::OnCancel() } auto env = callbackContext_->env_; callbackContext_->filePath_ = taskSignal_->filePath_; - napi_get_uv_event_loop(env, &loop); - if (loop == nullptr) { - return; - } - uv_work_t *work = new (std::nothrow) uv_work_t; - if (work == nullptr) { - return; - } - work->data = reinterpret_cast(callbackContext_.get()); - int ret = uv_queue_work_with_qos(loop, work, [](uv_work_t *work) {}, - [](uv_work_t *work, int status) { - JSCallbackContext *callbackContext = reinterpret_cast(work->data); - if (callbackContext == nullptr) { - return; - } - if (!callbackContext->ref_) { - return; - } - napi_handle_scope scope = nullptr; - napi_status ret = napi_open_handle_scope(callbackContext->env_, &scope); - if (ret != napi_ok) { - return; - } - napi_env env = callbackContext->env_; - napi_value jsCallback = callbackContext->ref_.Deref(env).val_; - napi_value filePath = LibN::NVal::CreateUTF8String(env, callbackContext->filePath_).val_; - napi_value retVal = nullptr; - ret = napi_call_function(env, nullptr, jsCallback, 1, &filePath, &retVal); - if (ret != napi_ok) { - HILOGE("Failed to call napi_call_function, ret: %{public}d", ret); - } - ret = napi_close_handle_scope(callbackContext->env_, scope); - if (ret != napi_ok) { - HILOGE("Failed to close handle scope, ret: %{public}d", ret); - } - delete work; - }, uv_qos_user_initiated); + JSCallbackContext *callbackContext = callbackContext_.get(); + auto task = [callbackContext] () { + if (callbackContext == nullptr) { + return; + } + if (!callbackContext->ref_) { + return; + } + napi_handle_scope scope = nullptr; + napi_status ret = napi_open_handle_scope(callbackContext->env_, &scope); + if (ret != napi_ok) { + return; + } + napi_env env = callbackContext->env_; + napi_value jsCallback = callbackContext->ref_.Deref(env).val_; + napi_value filePath = LibN::NVal::CreateUTF8String(env, callbackContext->filePath_).val_; + napi_value retVal = nullptr; + ret = napi_call_function(env, nullptr, jsCallback, 1, &filePath, &retVal); + if (ret != napi_ok) { + HILOGE("Failed to call napi_call_function, ret: %{public}d", ret); + } + ret = napi_close_handle_scope(callbackContext->env_, scope); + if (ret != napi_ok) { + HILOGE("Failed to close handle scope, ret: %{public}d", ret); + } + }; + auto ret = napi_send_event(env_, task, napi_eprio_immediate); if (ret != 0) { HILOGE("Failed to uv_queue_work_with_qos, ret: %{public}d", ret); - delete work; } } } // namespace OHOS::FileManagement::ModuleFileIO \ No newline at end of file diff --git a/interfaces/kits/js/src/mod_fs/class_watcher/watcher_n_exporter.cpp b/interfaces/kits/js/src/mod_fs/class_watcher/watcher_n_exporter.cpp index c42aa35ab7..90a62dbadf 100644 --- a/interfaces/kits/js/src/mod_fs/class_watcher/watcher_n_exporter.cpp +++ b/interfaces/kits/js/src/mod_fs/class_watcher/watcher_n_exporter.cpp @@ -118,7 +118,7 @@ napi_value WatcherNExporter::Start(napi_env env, napi_callback_info info) return NAsyncWorkPromise(env, thisVar).Schedule(procedureName, cbExec, cbCompl).val_; } -static void WatcherCallbackComplete(uv_work_t *work, int stat) +static void WatcherCallbackComplete(uv_work_t *work) { if (work == nullptr) { HILOGE("Failed to get uv_queue_work pointer"); @@ -165,12 +165,6 @@ static void WatcherCallbackComplete(uv_work_t *work, int stat) void WatcherNExporter::WatcherCallback(napi_env env, NRef &callback, const std::string &fileName, const uint32_t &event, const uint32_t &cookie) { - uv_loop_s *loop = nullptr; - napi_get_uv_event_loop(env, &loop); - if (loop == nullptr) { - HILOGE("Failed to get uv event loop"); - return; - } if (!callback) { HILOGE("Failed to parse watcher callback"); return; @@ -191,8 +185,10 @@ void WatcherNExporter::WatcherCallback(napi_env env, NRef &callback, const std:: callbackContext->event_ = event; callbackContext->cookie_ = cookie; work->data = reinterpret_cast(callbackContext); - int ret = uv_queue_work( - loop, work, [](uv_work_t *work) {}, reinterpret_cast(WatcherCallbackComplete)); + auto task = [work] () { + WatcherCallbackComplete(work); + }; + auto ret = napi_send_event(env_, task, napi_eprio_immediate); if (ret != 0) { HILOGE("Failed to execute libuv work queue, ret: %{public}d", ret); delete callbackContext; diff --git a/interfaces/kits/js/src/mod_fs/properties/connectdfs.cpp b/interfaces/kits/js/src/mod_fs/properties/connectdfs.cpp index 324ee94a7c..c2fb18b8c7 100644 --- a/interfaces/kits/js/src/mod_fs/properties/connectdfs.cpp +++ b/interfaces/kits/js/src/mod_fs/properties/connectdfs.cpp @@ -249,7 +249,7 @@ napi_value WrapString(napi_env &env, const std::string ¶m, const std::string return jsValue; } -void UvWorkAfterOnStaus(uv_work_t *work, int status) +void UvWorkAfterOnStaus(uv_work_t *work) { HILOGI("UvWorkAfterOnStaus called"); napi_handle_scope scope = nullptr; @@ -296,13 +296,6 @@ void UvWorkAfterOnStaus(uv_work_t *work, int status) void NAPIDfsListener::OnStatus(const std::string &networkId, int32_t status) { HILOGI("NAPIDfsListener::OnStatus called"); - uv_loop_s *loop = nullptr; - - napi_get_uv_event_loop(env_, &loop); - if (loop == nullptr) { - HILOGE("NAPIDfsListener::OnStatus, loop == nullptr"); - return; - } uv_work_t *work = new (std::nothrow) uv_work_t; if (work == nullptr) { @@ -326,8 +319,10 @@ void NAPIDfsListener::OnStatus(const std::string &networkId, int32_t status) connectDfsCB->status = status; work->data = static_cast(connectDfsCB); - int rev = uv_queue_work( - loop, work, [](uv_work_t *work) {}, UvWorkAfterOnStaus); + auto task = [work] () { + UvWorkAfterOnStaus(work); + }; + auto ret = napi_send_event(env_, task, napi_eprio_immediate); if (rev != ERRNO_NOERR) { delete connectDfsCB; connectDfsCB = nullptr; diff --git a/interfaces/kits/js/src/mod_fs/properties/copy.cpp b/interfaces/kits/js/src/mod_fs/properties/copy.cpp index a905646a57..7d6e34ef9c 100644 --- a/interfaces/kits/js/src/mod_fs/properties/copy.cpp +++ b/interfaces/kits/js/src/mod_fs/properties/copy.cpp @@ -540,7 +540,7 @@ void Copy::UnregisterListener(std::shared_ptr infos) jsCbMap_.erase(*infos); } -void Copy::ReceiveComplete(uv_work_t *work, int stat) +void Copy::ReceiveComplete(uv_work_t *work) { if (work == nullptr) { HILOGE("uv_work_t pointer is nullptr."); @@ -622,10 +622,10 @@ void Copy::OnFileReceive(std::shared_ptr infos) HILOGE("failed to get uv work"); return; } - uv_loop_s *loop = nullptr; - napi_get_uv_event_loop(infos->env, &loop); - auto ret = uv_queue_work( - loop, work, [](uv_work_t *work) {}, reinterpret_cast(ReceiveComplete)); + auto task = [work] () { + ReceiveComplete(work); + }; + auto ret = napi_send_event(env_, task, napi_eprio_immediate); if (ret != 0) { HILOGE("failed to uv_queue_work"); delete (reinterpret_cast(work->data)); diff --git a/interfaces/kits/js/src/mod_fs/properties/copy.h b/interfaces/kits/js/src/mod_fs/properties/copy.h index e0c30ca703..5c3a475d3c 100644 --- a/interfaces/kits/js/src/mod_fs/properties/copy.h +++ b/interfaces/kits/js/src/mod_fs/properties/copy.h @@ -151,7 +151,7 @@ private: static void GetNotifyEvent(std::shared_ptr infos); static void StartNotify(std::shared_ptr infos, std::shared_ptr callback); static uv_work_t *GetUVwork(std::shared_ptr infos); - static void ReceiveComplete(uv_work_t *work, int stat); + static void ReceiveComplete(uv_work_t *work); static std::shared_ptr GetRegisteredListener(std::shared_ptr infos); static void CloseNotifyFd(std::shared_ptr infos, std::shared_ptr callback); static void CloseNotifyFdLocked(std::shared_ptr infos, std::shared_ptr callback); diff --git a/interfaces/kits/js/src/mod_fs/properties/copy_listener/trans_listener.cpp b/interfaces/kits/js/src/mod_fs/properties/copy_listener/trans_listener.cpp index f6de256a69..11a833ccdf 100644 --- a/interfaces/kits/js/src/mod_fs/properties/copy_listener/trans_listener.cpp +++ b/interfaces/kits/js/src/mod_fs/properties/copy_listener/trans_listener.cpp @@ -299,34 +299,46 @@ int32_t TransListener::OnFileReceive(uint64_t totalBytes, uint64_t processedByte return ENOMEM; } - uv_loop_s *loop = nullptr; - napi_get_uv_event_loop(callback_->env, &loop); - if (loop == nullptr) { - HILOGE("Failed to get uv event loop"); - return ENOMEM; - } - - uv_work_t *work = new (std::nothrow) uv_work_t; - if (work == nullptr) { - HILOGE("Failed to create uv_work_t pointer"); - return ENOMEM; - } - UvEntry *entry = new (std::nothrow) UvEntry(callback_); if (entry == nullptr) { HILOGE("entry ptr is nullptr"); - delete work; return ENOMEM; } entry->progressSize = processedBytes; entry->totalSize = totalBytes; - work->data = entry; - int retVal = uv_queue_work( - loop, work, [](uv_work_t *work) {}, reinterpret_cast(CallbackComplete)); + auto task = [entry] () { + if (entry == nullptr) { + HILOGE("entry pointer is nullptr."); + return; + } + napi_handle_scope scope = nullptr; + napi_env env = entry->callback->env; + napi_status status = napi_open_handle_scope(env, &scope); + if (status != napi_ok) { + HILOGE("Failed to open handle scope, status: %{public}d.", status); + return; + } + NVal obj = NVal::CreateObject(env); + if (entry->progressSize <= MAX_VALUE && entry->totalSize <= MAX_VALUE) { + obj.AddProp("processedSize", NVal::CreateInt64(env, entry->progressSize).val_); + obj.AddProp("totalSize", NVal::CreateInt64(env, entry->totalSize).val_); + } + + napi_value result = nullptr; + napi_value jsCallback = entry->callback->nRef.Deref(env).val_; + status = napi_call_function(env, nullptr, jsCallback, 1, &(obj.val_), &result); + if (status != napi_ok) { + HILOGE("Failed to get result, status: %{public}d.", status); + } + status = napi_close_handle_scope(env, scope); + if (status != napi_ok) { + HILOGE("Failed to close scope, status: %{public}d.", status); + } + }; + auto retVal = napi_send_event(env_, task, napi_eprio_immediate); if (retVal != 0) { HILOGE("failed to get uv_queue_work"); - delete (reinterpret_cast(work->data)); - delete work; + delete entry; return ENOMEM; } return ERRNO_NOERR; 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 4d0a1c98a0..9cad32c850 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 @@ -65,15 +65,11 @@ NAsyncWorkCallback::~NAsyncWorkCallback() HILOGE("Failed to new uv_work_t"); return; } - work->data = static_cast(ctx_); - - int ret = uv_queue_work( - loop, work.get(), [](uv_work_t *work) {}, - [](uv_work_t *work, int status) { - NAsyncContextCallback *ctx = static_cast(work->data); - delete ctx; - delete work; - }); + NAsyncContextCallback *ctx = ctx_; + auto task = [ctx] () { + delete ctx; + }; + auto ret = napi_send_event(env_, task, napi_eprio_immediate); if (ret) { HILOGE("Failed to call uv_queue_work %{public}d", status); return; @@ -208,19 +204,6 @@ void NAsyncWorkCallback::ThreadSafeSchedule(NContextCBComplete cbComplete) ctx_->cbExec_ = nullptr; ctx_->cbComplete_ = nullptr; - uv_loop_s *loop = nullptr; - napi_status status = napi_get_uv_event_loop(env_, &loop); - if (status != napi_ok) { - HILOGE("Failed to get uv event loop"); - return; - } - - auto work = CreateUniquePtr(); - if (!work) { - HILOGE("Failed to new uv_work_t"); - return; - } - struct WorkArgs { NAsyncWorkCallback *ptr = nullptr; NContextCBComplete cb; @@ -228,28 +211,18 @@ void NAsyncWorkCallback::ThreadSafeSchedule(NContextCBComplete cbComplete) auto workArgs = make_unique(); workArgs->ptr = this; workArgs->cb = cbComplete; - - work->data = static_cast(workArgs.get()); - - int ret = uv_queue_work( - loop, work.get(), [](uv_work_t *work) { - HILOGI("Enter, %{public}zu", (size_t)work); - }, - [](uv_work_t *work, int status) { - HILOGI("AsyncWork Enter, %{public}zu", (size_t)work); - auto workArgs = static_cast(work->data); - AfterWorkCallback(workArgs->ptr->env_, napi_ok, workArgs->ptr->ctx_, workArgs->cb); - delete workArgs; - delete work; - }); + auto workArgsRaw = workArgs.get(); + auto task = [workArgsRaw] () { + AfterWorkCallback(workArgsRaw->ptr->env_, napi_ok, workArgsRaw->ptr->ctx_, workArgsRaw->cb); + delete workArgsRaw; + }; + auto ret = napi_send_event(env_, task, napi_eprio_immediate); if (ret) { - HILOGE("Failed to call uv_queue_work %{public}d", status); + HILOGE("Failed to call napi_send_event"); workArgs.reset(); - work.reset(); return; } workArgs.release(); - work.release(); } } // namespace LibN } // namespace FileManagement -- Gitee From a1023b209462ad2cf739f45966c30c26b8d57aa6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E9=91=AB?= Date: Sat, 28 Dec 2024 17:32:31 +0800 Subject: [PATCH 2/3] =?UTF-8?q?env=E5=8F=82=E6=95=B0=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 周鑫 --- .../kits/js/src/mod_fs/class_tasksignal/task_signal_entity.cpp | 2 +- .../kits/js/src/mod_fs/class_watcher/watcher_n_exporter.cpp | 2 +- interfaces/kits/js/src/mod_fs/properties/connectdfs.cpp | 2 +- interfaces/kits/js/src/mod_fs/properties/copy.cpp | 2 +- .../js/src/mod_fs/properties/copy_listener/trans_listener.cpp | 3 ++- 5 files changed, 6 insertions(+), 5 deletions(-) diff --git a/interfaces/kits/js/src/mod_fs/class_tasksignal/task_signal_entity.cpp b/interfaces/kits/js/src/mod_fs/class_tasksignal/task_signal_entity.cpp index b6ea8f2f4b..a09f63bb10 100644 --- a/interfaces/kits/js/src/mod_fs/class_tasksignal/task_signal_entity.cpp +++ b/interfaces/kits/js/src/mod_fs/class_tasksignal/task_signal_entity.cpp @@ -53,7 +53,7 @@ void TaskSignalEntity::OnCancel() HILOGE("Failed to close handle scope, ret: %{public}d", ret); } }; - auto ret = napi_send_event(env_, task, napi_eprio_immediate); + auto ret = napi_send_event(env, task, napi_eprio_immediate); if (ret != 0) { HILOGE("Failed to uv_queue_work_with_qos, ret: %{public}d", ret); } diff --git a/interfaces/kits/js/src/mod_fs/class_watcher/watcher_n_exporter.cpp b/interfaces/kits/js/src/mod_fs/class_watcher/watcher_n_exporter.cpp index 90a62dbadf..8637f5f209 100644 --- a/interfaces/kits/js/src/mod_fs/class_watcher/watcher_n_exporter.cpp +++ b/interfaces/kits/js/src/mod_fs/class_watcher/watcher_n_exporter.cpp @@ -188,7 +188,7 @@ void WatcherNExporter::WatcherCallback(napi_env env, NRef &callback, const std:: auto task = [work] () { WatcherCallbackComplete(work); }; - auto ret = napi_send_event(env_, task, napi_eprio_immediate); + auto ret = napi_send_event(env, task, napi_eprio_immediate); if (ret != 0) { HILOGE("Failed to execute libuv work queue, ret: %{public}d", ret); delete callbackContext; diff --git a/interfaces/kits/js/src/mod_fs/properties/connectdfs.cpp b/interfaces/kits/js/src/mod_fs/properties/connectdfs.cpp index c2fb18b8c7..f59567a592 100644 --- a/interfaces/kits/js/src/mod_fs/properties/connectdfs.cpp +++ b/interfaces/kits/js/src/mod_fs/properties/connectdfs.cpp @@ -323,7 +323,7 @@ void NAPIDfsListener::OnStatus(const std::string &networkId, int32_t status) UvWorkAfterOnStaus(work); }; auto ret = napi_send_event(env_, task, napi_eprio_immediate); - if (rev != ERRNO_NOERR) { + if (ret != ERRNO_NOERR) { delete connectDfsCB; connectDfsCB = nullptr; delete work; diff --git a/interfaces/kits/js/src/mod_fs/properties/copy.cpp b/interfaces/kits/js/src/mod_fs/properties/copy.cpp index 7d6e34ef9c..76a9718470 100644 --- a/interfaces/kits/js/src/mod_fs/properties/copy.cpp +++ b/interfaces/kits/js/src/mod_fs/properties/copy.cpp @@ -625,7 +625,7 @@ void Copy::OnFileReceive(std::shared_ptr infos) auto task = [work] () { ReceiveComplete(work); }; - auto ret = napi_send_event(env_, task, napi_eprio_immediate); + auto ret = napi_send_event(infos->env, task, napi_eprio_immediate); if (ret != 0) { HILOGE("failed to uv_queue_work"); delete (reinterpret_cast(work->data)); diff --git a/interfaces/kits/js/src/mod_fs/properties/copy_listener/trans_listener.cpp b/interfaces/kits/js/src/mod_fs/properties/copy_listener/trans_listener.cpp index 11a833ccdf..8da5084974 100644 --- a/interfaces/kits/js/src/mod_fs/properties/copy_listener/trans_listener.cpp +++ b/interfaces/kits/js/src/mod_fs/properties/copy_listener/trans_listener.cpp @@ -306,6 +306,7 @@ int32_t TransListener::OnFileReceive(uint64_t totalBytes, uint64_t processedByte } entry->progressSize = processedBytes; entry->totalSize = totalBytes; + auto env = entry->callback->env; auto task = [entry] () { if (entry == nullptr) { HILOGE("entry pointer is nullptr."); @@ -335,7 +336,7 @@ int32_t TransListener::OnFileReceive(uint64_t totalBytes, uint64_t processedByte HILOGE("Failed to close scope, status: %{public}d.", status); } }; - auto retVal = napi_send_event(env_, task, napi_eprio_immediate); + auto retVal = napi_send_event(env, task, napi_eprio_immediate); if (retVal != 0) { HILOGE("failed to get uv_queue_work"); delete entry; -- Gitee From b0916e262212f247b32afc3dfa68ae0102e2651f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E9=91=AB?= Date: Sat, 28 Dec 2024 17:58:47 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E5=8F=98=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 周鑫 --- .../js/src/mod_fs/class_tasksignal/task_signal_entity.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/interfaces/kits/js/src/mod_fs/class_tasksignal/task_signal_entity.cpp b/interfaces/kits/js/src/mod_fs/class_tasksignal/task_signal_entity.cpp index a09f63bb10..99fee553d4 100644 --- a/interfaces/kits/js/src/mod_fs/class_tasksignal/task_signal_entity.cpp +++ b/interfaces/kits/js/src/mod_fs/class_tasksignal/task_signal_entity.cpp @@ -21,10 +21,6 @@ TaskSignalEntity::~TaskSignalEntity() {} void TaskSignalEntity::OnCancel() { - uv_loop_s *loop = nullptr; - if (!callbackContext_) { - return; - } auto env = callbackContext_->env_; callbackContext_->filePath_ = taskSignal_->filePath_; JSCallbackContext *callbackContext = callbackContext_.get(); -- Gitee