summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/env-inl.h4
-rw-r--r--src/env.cc11
-rw-r--r--src/env.h3
-rw-r--r--src/node.cc8
-rw-r--r--test/cctest/test_environment.cc10
5 files changed, 29 insertions, 7 deletions
diff --git a/src/env-inl.h b/src/env-inl.h
index 5643fffb6f..1e64a0fda5 100644
--- a/src/env-inl.h
+++ b/src/env-inl.h
@@ -311,6 +311,10 @@ inline Environment* Environment::GetCurrent(
info.Data().template As<v8::External>()->Value());
}
+inline Environment* Environment::GetThreadLocalEnv() {
+ return static_cast<Environment*>(uv_key_get(&thread_local_env));
+}
+
inline Environment::Environment(IsolateData* isolate_data,
v8::Local<v8::Context> context)
: isolate_(context->GetIsolate()),
diff --git a/src/env.cc b/src/env.cc
index 07e37498c8..cb1f4a231b 100644
--- a/src/env.cc
+++ b/src/env.cc
@@ -80,6 +80,11 @@ v8::CpuProfiler* IsolateData::GetCpuProfiler() {
return cpu_profiler_;
}
+
+void InitThreadLocalOnce() {
+ CHECK_EQ(0, uv_key_create(&Environment::thread_local_env));
+}
+
void Environment::Start(int argc,
const char* const* argv,
int exec_argc,
@@ -147,6 +152,10 @@ void Environment::Start(int argc,
SetupProcessObject(this, argc, argv, exec_argc, exec_argv);
LoadAsyncWrapperInfo(this);
+
+ static uv_once_t init_once = UV_ONCE_INIT;
+ uv_once(&init_once, InitThreadLocalOnce);
+ uv_key_set(&thread_local_env, this);
}
void Environment::CleanupHandles() {
@@ -471,4 +480,6 @@ void Environment::AsyncHooks::grow_async_ids_stack() {
async_ids_stack_.GetJSArray()).FromJust();
}
+uv_key_t Environment::thread_local_env = {};
+
} // namespace node
diff --git a/src/env.h b/src/env.h
index dedf821b24..a9118082b8 100644
--- a/src/env.h
+++ b/src/env.h
@@ -564,6 +564,9 @@ class Environment {
static inline Environment* GetCurrent(
const v8::PropertyCallbackInfo<T>& info);
+ static uv_key_t thread_local_env;
+ static inline Environment* GetThreadLocalEnv();
+
inline Environment(IsolateData* isolate_data, v8::Local<v8::Context> context);
inline ~Environment();
diff --git a/src/node.cc b/src/node.cc
index 149d287950..0d62c89b03 100644
--- a/src/node.cc
+++ b/src/node.cc
@@ -4207,11 +4207,8 @@ uv_loop_t* GetCurrentEventLoop(v8::Isolate* isolate) {
}
-static uv_key_t thread_local_env;
-
-
void AtExit(void (*cb)(void* arg), void* arg) {
- auto env = static_cast<Environment*>(uv_key_get(&thread_local_env));
+ auto env = Environment::GetThreadLocalEnv();
AtExit(env, cb, arg);
}
@@ -4342,8 +4339,6 @@ inline int Start(Isolate* isolate, IsolateData* isolate_data,
Local<Context> context = NewContext(isolate);
Context::Scope context_scope(context);
Environment env(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);
const char* path = argc > 1 ? argv[1] : nullptr;
@@ -4393,7 +4388,6 @@ inline int Start(Isolate* isolate, IsolateData* isolate_data,
const int exit_code = EmitExit(&env);
RunAtExit(&env);
- uv_key_delete(&thread_local_env);
v8_platform.DrainVMTasks(isolate);
v8_platform.CancelVMTasks(isolate);
diff --git a/test/cctest/test_environment.cc b/test/cctest/test_environment.cc
index c559a21fda..07170ac267 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};
+
+ 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;