diff --git a/worker/worker.cpp b/worker/worker.cpp index c9acebc405fdb027ecec0a863223f07b5e7a29f3..726510447c99d62075582ecc99aba4cd712b7fd2 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 f151bc9b450940927e99d098d533639a29fbce55..9ee477952cbac4681c8d9d395d514580b626332c 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};