diff --git a/src/node.cc b/src/node.cc index 4e3638b886fcb8..a8ae810f050a1a 100644 --- a/src/node.cc +++ b/src/node.cc @@ -4296,12 +4296,18 @@ Environment* CreateEnvironment(IsolateData* isolate_data, HandleScope handle_scope(isolate); Context::Scope context_scope(context); auto env = new Environment(isolate_data, context); + CHECK_EQ(0, uv_key_create(&thread_local_env)); + uv_key_set(&thread_local_env, env); env->Start(argc, argv, exec_argc, exec_argv, v8_is_profiling); return env; } void FreeEnvironment(Environment* env) { + auto tl_env = static_cast(uv_key_get(&thread_local_env)); + if (tl_env == env) { + uv_key_delete(&thread_local_env); + } delete env; } diff --git a/test/cctest/test_environment.cc b/test/cctest/test_environment.cc index c559a21fda1530..c5ed4499351a2a 100644 --- a/test/cctest/test_environment.cc +++ b/test/cctest/test_environment.cc @@ -33,6 +33,16 @@ TEST_F(EnvironmentTest, AtExitWithEnvironment) { EXPECT_TRUE(called_cb_1); } +TEST_F(EnvironmentTest, AtExitWithoutEnvironment) { + const v8::HandleScope handle_scope(isolate_); + const Argv argv; + Env env {handle_scope, argv, this}; + + AtExit(at_exit_callback1); // No Environment is passed to AtExit. + RunAtExit(*env); + EXPECT_TRUE(called_cb_1); +} + TEST_F(EnvironmentTest, AtExitWithArgument) { const v8::HandleScope handle_scope(isolate_); const Argv argv;