From e16935bea5c5d35710013d58d0564984b672105b Mon Sep 17 00:00:00 2001 From: wangzhaoyong <970691906@qq.com> Date: Tue, 9 Aug 2022 16:12:54 +0800 Subject: [PATCH] fix worker timer bug issue:https://gitee.com/openharmony/commonlibrary_ets_utils/issues/I5LBG9 Signed-off-by: wangzhaoyong <970691906@qq.com> --- helper/object_helper.h | 2 ++ plugin/timer.cpp | 20 +++++++++++++++++--- plugin/timer.h | 2 ++ worker/worker.h | 1 + 4 files changed, 22 insertions(+), 3 deletions(-) diff --git a/helper/object_helper.h b/helper/object_helper.h index f754863..35e3da1 100644 --- a/helper/object_helper.h +++ b/helper/object_helper.h @@ -43,6 +43,7 @@ public: delete[] value; } else { delete value; + value = nullptr; } } }; @@ -60,6 +61,7 @@ public: delete[] data_; } else { delete data_; + data_ = nullptr; } } diff --git a/plugin/timer.cpp b/plugin/timer.cpp index 4cd59ad..4ad2337 100644 --- a/plugin/timer.cpp +++ b/plugin/timer.cpp @@ -31,7 +31,21 @@ TimerCallbackInfo::~TimerCallbackInfo() Helper::CloseHelp::DeletePointer(argv_, true); uv_timer_stop(&timeReq_); - uv_close(reinterpret_cast(&timeReq_), nullptr); + uv_close(reinterpret_cast(&timeReq_), [](uv_handle_t* handle) { + if (handle != NULL) { + delete (uv_timer_t*)handle; + } + }); +} + +void TimerCallbackInfo::DeleteTimerCallbackInfo() +{ + Helper::NapiHelper::DeleteReference(env_, callback_); + for (size_t idx = 0; idx < argc_; idx++) { + Helper::NapiHelper::DeleteReference(env_, argv_[idx]); + } + Helper::CloseHelp::DeletePointer(argv_, true); + uv_timer_stop(&timeReq_); } bool Timer::RegisterTime(napi_env env) @@ -86,7 +100,7 @@ napi_value Timer::ClearTimer(napi_env env, napi_callback_info cbinfo) } TimerCallbackInfo* callbackInfo = iter->second; timerTable.erase(tId); - Helper::CloseHelp::DeletePointer(callbackInfo, false); + callbackInfo->DeleteTimerCallbackInfo(); return Helper::NapiHelper::GetUndefinedValue(env); } @@ -112,7 +126,7 @@ void Timer::TimerCallback(uv_timer_t* handle) } if (!callbackInfo->repeat_) { timerTable.erase(callbackInfo->tId_); - Helper::CloseHelp::DeletePointer(callbackInfo, false); + callbackInfo->DeleteTimerCallbackInfo(); } else { uv_timer_again(handle); } diff --git a/plugin/timer.h b/plugin/timer.h index 08a2cb5..a1087cb 100644 --- a/plugin/timer.h +++ b/plugin/timer.h @@ -45,6 +45,8 @@ struct TimerCallbackInfo { } ~TimerCallbackInfo(); + + void DeleteTimerCallbackInfo(); }; class Timer { diff --git a/worker/worker.h b/worker/worker.h index df28846..41715ce 100644 --- a/worker/worker.h +++ b/worker/worker.h @@ -369,6 +369,7 @@ public: uv_run(loop, UV_RUN_DEFAULT); } else { HILOG_ERROR("worker:: Worker loop is nullptr when start worker loop"); + return; } } -- Gitee