From 2131b5a21eda41bb154a4d9479214f71c47a158c Mon Sep 17 00:00:00 2001 From: theanarkh Date: Sat, 29 Oct 2022 03:38:22 +0800 Subject: [PATCH] src: call uv_library_shutdown before DisposePlatform When the process exits, there may be tasks in the thread pool that need to access data in the platform, such as trace agent. So make sure the thread pool exits first. see https://github.com/nodejs/node/pull/44458 --- src/api/environment.cc | 7 ++++++- src/node_v8_platform-inl.h | 3 ++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/api/environment.cc b/src/api/environment.cc index 6bc4033b97da5a..2c9f4adc7585f4 100644 --- a/src/api/environment.cc +++ b/src/api/environment.cc @@ -773,8 +773,13 @@ void DefaultProcessExitHandlerInternal(Environment* env, ExitCode exit_code) { env->set_can_call_into_js(false); env->stop_sub_worker_contexts(); env->isolate()->DumpAndResetStats(); - DisposePlatform(); + // When the process exits, the tasks in the thread pool may also need to + // access the data of V8Platform, such as trace agent, or a field + // added in the future. So make sure the thread pool exits first. + // And make sure V8Platform don not call into Libuv threadpool, see Dispose + // in node_v8_platform-inl.h uv_library_shutdown(); + DisposePlatform(); Exit(exit_code); } diff --git a/src/node_v8_platform-inl.h b/src/node_v8_platform-inl.h index d79dd99bf34da6..2504ff30b77e20 100644 --- a/src/node_v8_platform-inl.h +++ b/src/node_v8_platform-inl.h @@ -103,7 +103,8 @@ struct V8Platform { platform_ = new NodePlatform(thread_pool_size, controller); v8::V8::InitializePlatform(platform_); } - + // Make sure V8Platform don not call into Libuv threadpool, + // see DefaultProcessExitHandlerInternal in environment.cc inline void Dispose() { if (!initialized_) return;