!63 sync debugger signal bugfix to release

Merge pull request !63 from Gymee/debugger_bugfix_release
This commit is contained in:
openharmony_ci
2022-07-20 03:52:48 +00:00
committed by Gitee
2 changed files with 45 additions and 0 deletions
+36
View File
@@ -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;
@@ -192,6 +196,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<uv_async_cb>(Worker::WorkerOnMessage));
#if !defined(WINDOWS_PLATFORM) && !defined(MAC_PLATFORM)
uv_async_init(loop, &worker->debuggerOnPostTaskSignal_, reinterpret_cast<uv_async_cb>(
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 = DereferenceHelp::DereferenceOf(&Worker::debuggerOnPostTaskSignal_, req);
if (worker == nullptr) {
HILOG_ERROR("worker::worker is null");
return;
}
worker->debuggerTask_();
}
void Worker::DebuggerOnPostTask(std::function<void()>&& 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 = DereferenceHelp::DereferenceOf(&Worker::workerOnMessageSignal_, req);
@@ -352,6 +385,9 @@ void Worker::TerminateWorker()
{
// when there is no active handle, worker loop will stop automatic.
uv_close((uv_handle_t*)&workerOnMessageSignal_, nullptr);
#if !defined(WINDOWS_PLATFORM) && !defined(MAC_PLATFORM)
uv_close(reinterpret_cast<uv_handle_t*>(&debuggerOnPostTaskSignal_), nullptr);
#endif
CloseWorkerCallback();
uv_loop_t* loop = GetWorkerLoop();
if (loop != nullptr) {
+9
View File
@@ -242,6 +242,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<void()>&& task);
#endif
napi_env GetHostEnv() const
{
return hostEnv_;
@@ -263,6 +268,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<void()> debuggerTask_;
#endif
std::atomic<RunnerState> runnerState_ {STARTING};
std::atomic<HostState> hostState_ {ACTIVE};