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(); StartProfilerIdleNotifier();
} }
void Environment::ExitEnv() { void Environment::ExitEnv(StopFlags::Flags flags) {
// Should not access non-thread-safe methods here. // Should not access non-thread-safe methods here.
set_stopping(true); set_stopping(true);
isolate_->TerminateExecution(); if ((flags & StopFlags::kDoNotTerminateIsolate) == 0)
isolate_->TerminateExecution();
SetImmediateThreadsafe([](Environment* env) { SetImmediateThreadsafe([](Environment* env) {
env->set_can_call_into_js(false); env->set_can_call_into_js(false);
uv_stop(env->event_loop()); uv_stop(env->event_loop());

View file

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

View file

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

View file

@ -273,6 +273,15 @@ enum Flags : uint32_t {
} // namespace ProcessInitializationFlags } // namespace ProcessInitializationFlags
namespace ProcessFlags = ProcessInitializationFlags; // Legacy alias. 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 { class NODE_EXTERN InitializationResult {
public: public:
virtual ~InitializationResult(); 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 // Tear down Node.js while it is running (there are active handles
// in the loop and / or actively executing JavaScript code). // in the loop and / or actively executing JavaScript code).
NODE_EXTERN int Stop(Environment* env); 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 // 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 // from argv, fill exec_argv, and possibly add errors resulting from parsing