src: allow optional Isolate termination in node::Stop()

PR-URL: https://github.com/nodejs/node/pull/46583
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com>
This commit is contained in:
Shelley Vohr 2023-02-17 23:54:40 +01:00 committed by GitHub
parent 0084fc7994
commit c566a04c86
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 19 additions and 4 deletions

View File

@ -911,10 +911,11 @@ void Environment::InitializeLibuv() {
StartProfilerIdleNotifier();
}
void Environment::ExitEnv() {
void Environment::ExitEnv(StopFlags::Flags flags) {
// Should not access non-thread-safe methods here.
set_stopping(true);
isolate_->TerminateExecution();
if ((flags & StopFlags::kDoNotTerminateIsolate) == 0)
isolate_->TerminateExecution();
SetImmediateThreadsafe([](Environment* env) {
env->set_can_call_into_js(false);
uv_stop(env->event_loop());

View File

@ -636,7 +636,7 @@ class Environment : public MemoryRetainer {
void RegisterHandleCleanups();
void CleanupHandles();
void Exit(ExitCode code);
void ExitEnv();
void ExitEnv(StopFlags::Flags flags);
// Register clean-up cb to be called on environment destruction.
inline void RegisterHandleCleanup(uv_handle_t* handle,

View File

@ -1254,7 +1254,11 @@ int Start(int argc, char** argv) {
}
int Stop(Environment* env) {
env->ExitEnv();
return Stop(env, StopFlags::kNoFlags);
}
int Stop(Environment* env, StopFlags::Flags flags) {
env->ExitEnv(flags);
return 0;
}

View File

@ -273,6 +273,15 @@ enum Flags : uint32_t {
} // namespace ProcessInitializationFlags
namespace ProcessFlags = ProcessInitializationFlags; // Legacy alias.
namespace StopFlags {
enum Flags : uint32_t {
kNoFlags = 0,
// Do not explicitly terminate the Isolate
// when exiting the Environment.
kDoNotTerminateIsolate = 1 << 0,
};
} // namespace StopFlags
class NODE_EXTERN InitializationResult {
public:
virtual ~InitializationResult();
@ -309,6 +318,7 @@ NODE_EXTERN int Start(int argc, char* argv[]);
// Tear down Node.js while it is running (there are active handles
// in the loop and / or actively executing JavaScript code).
NODE_EXTERN int Stop(Environment* env);
NODE_EXTERN int Stop(Environment* env, StopFlags::Flags flags);
// Set up per-process state needed to run Node.js. This will consume arguments
// from argv, fill exec_argv, and possibly add errors resulting from parsing