From bc385becf92b1112bfb5e61e55880ae90abea561 Mon Sep 17 00:00:00 2001 From: Gymee Date: Wed, 22 Jun 2022 21:15:45 +0800 Subject: [PATCH] fix debugger signal bugs Signed-off-by: Gymee Change-Id: Iaad2bece169fe5383e4c08b2b924c99216a229e0 --- worker/worker.cpp | 36 ++++++++++++++++++++++++++++++++++++ worker/worker.h | 9 +++++++++ 2 files changed, 45 insertions(+) diff --git a/worker/worker.cpp b/worker/worker.cpp index c9acebc..7265104 100644 --- a/worker/worker.cpp +++ b/worker/worker.cpp @@ -95,6 +95,10 @@ bool Worker::PrepareForWorkerInstance() HILOG_ERROR("worker:: CallWorkerAsyncWorkFunc error"); } // 2. init worker environment +#if !defined(WINDOWS_PLATFORM) && !defined(MAC_PLATFORM) + workerEngine->SetDebuggerPostTaskFunc( + std::bind(&Worker::DebuggerOnPostTask, this, std::placeholders::_1)); +#endif if (!hostEngine->CallInitWorkerFunc(workerEngine)) { HILOG_ERROR("worker:: CallInitWorkerFunc error"); return false; @@ -194,6 +198,10 @@ void Worker::ExecuteInThread(const void* data) // 2. add some preparation for the worker if (worker->PrepareForWorkerInstance()) { uv_async_init(loop, &worker->workerOnMessageSignal_, reinterpret_cast(Worker::WorkerOnMessage)); +#if !defined(WINDOWS_PLATFORM) && !defined(MAC_PLATFORM) + uv_async_init(loop, &worker->debuggerOnPostTaskSignal_, reinterpret_cast( + Worker::HandleDebuggerTask)); +#endif worker->UpdateWorkerState(RUNNING); // in order to invoke worker send before subThread start uv_async_send(&worker->workerOnMessageSignal_); @@ -260,6 +268,31 @@ void Worker::HostOnError(const uv_async_t* req) worker->TerminateInner(); } +#if !defined(WINDOWS_PLATFORM) && !defined(MAC_PLATFORM) +void Worker::HandleDebuggerTask(const uv_async_t* req) +{ + Worker* worker = Helper::DereferenceHelp::DereferenceOf(&Worker::debuggerOnPostTaskSignal_, req); + if (worker == nullptr) { + HILOG_ERROR("worker::worker is null"); + return; + } + + worker->debuggerTask_(); +} + +void Worker::DebuggerOnPostTask(std::function&& task) +{ + if (IsTerminated()) { + HILOG_ERROR("worker:: worker has been terminated."); + return; + } + if (uv_is_active((uv_handle_t*)&debuggerOnPostTaskSignal_)) { + debuggerTask_ = std::move(task); + uv_async_send(&debuggerOnPostTaskSignal_); + } +} +#endif + void Worker::WorkerOnMessage(const uv_async_t* req) { Worker* worker = Helper::DereferenceHelp::DereferenceOf(&Worker::workerOnMessageSignal_, req); @@ -349,6 +382,9 @@ void Worker::TerminateWorker() { // when there is no active handle, worker loop will stop automatic. uv_close(reinterpret_cast(&workerOnMessageSignal_), nullptr); +#if !defined(WINDOWS_PLATFORM) && !defined(MAC_PLATFORM) + uv_close(reinterpret_cast(&debuggerOnPostTaskSignal_), nullptr); +#endif CloseWorkerCallback(); uv_loop_t* loop = GetWorkerLoop(); if (loop != nullptr) { diff --git a/worker/worker.h b/worker/worker.h index f151bc9..9ee4779 100644 --- a/worker/worker.h +++ b/worker/worker.h @@ -403,6 +403,11 @@ private: void ParentPortRemoveListenerInner(napi_env env, const char* type, napi_ref callback); void PreparePandafile(); +#if !defined(WINDOWS_PLATFORM) && !defined(MAC_PLATFORM) + static void HandleDebuggerTask(const uv_async_t* req); + void DebuggerOnPostTask(std::function&& task); +#endif + napi_env GetHostEnv() const { return hostEnv_; @@ -424,6 +429,10 @@ private: uv_async_t workerOnMessageSignal_ {}; uv_async_t hostOnMessageSignal_ {}; uv_async_t hostOnErrorSignal_ {}; +#if !defined(WINDOWS_PLATFORM) && !defined(MAC_PLATFORM) + uv_async_t debuggerOnPostTaskSignal_ {}; + std::function debuggerTask_; +#endif std::atomic runnerState_ {STARTING}; std::atomic hostState_ {ACTIVE}; -- Gitee