mirror of
https://github.com/zebrajr/node.git
synced 2026-01-15 12:15:26 +00:00
src: schedule destroy hooks in BeforeExit early during bootstrap
Instead of doing it in the `internalBinding('async_wrap')`
initialization whose first call is uncertain depending on how
the native modules are loaded in JS land during bootstrap.
PR-URL: https://github.com/nodejs/node/pull/25020
Reviewed-By: Jeremiah Senkpiel <fishrock123@rocketmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Anna Henningsen <anna@addaleax.net>
This commit is contained in:
@@ -88,8 +88,7 @@ struct AsyncWrapObject : public AsyncWrap {
|
||||
SET_SELF_SIZE(AsyncWrapObject)
|
||||
};
|
||||
|
||||
|
||||
static void DestroyAsyncIdsCallback(Environment* env, void* data) {
|
||||
void AsyncWrap::DestroyAsyncIdsCallback(Environment* env, void* data) {
|
||||
Local<Function> fn = env->async_hooks_destroy_function();
|
||||
|
||||
TryCatchScope try_catch(env, TryCatchScope::CatchMode::kFatal);
|
||||
@@ -112,13 +111,6 @@ static void DestroyAsyncIdsCallback(Environment* env, void* data) {
|
||||
} while (!env->destroy_async_id_list()->empty());
|
||||
}
|
||||
|
||||
static void DestroyAsyncIdsCallback(void* arg) {
|
||||
Environment* env = static_cast<Environment*>(arg);
|
||||
if (!env->destroy_async_id_list()->empty())
|
||||
DestroyAsyncIdsCallback(env, nullptr);
|
||||
}
|
||||
|
||||
|
||||
void Emit(Environment* env, double async_id, AsyncHooks::Fields type,
|
||||
Local<Function> fn) {
|
||||
AsyncHooks* async_hooks = env->async_hooks();
|
||||
@@ -446,8 +438,6 @@ void AsyncWrap::Initialize(Local<Object> target,
|
||||
Isolate* isolate = env->isolate();
|
||||
HandleScope scope(isolate);
|
||||
|
||||
env->BeforeExit(DestroyAsyncIdsCallback, env);
|
||||
|
||||
env->SetMethod(target, "setupHooks", SetupHooks);
|
||||
env->SetMethod(target, "pushAsyncIds", PushAsyncIds);
|
||||
env->SetMethod(target, "popAsyncIds", PopAsyncIds);
|
||||
|
||||
@@ -141,6 +141,7 @@ class AsyncWrap : public BaseObject {
|
||||
static void EmitTraceEventAfter(ProviderType type, double async_id);
|
||||
void EmitTraceEventDestroy();
|
||||
|
||||
static void DestroyAsyncIdsCallback(Environment* env, void* data);
|
||||
|
||||
inline ProviderType provider_type() const;
|
||||
|
||||
|
||||
@@ -211,6 +211,14 @@ Environment::Environment(IsolateData* isolate_data,
|
||||
}
|
||||
|
||||
destroy_async_id_list_.reserve(512);
|
||||
BeforeExit(
|
||||
[](void* arg) {
|
||||
Environment* env = static_cast<Environment*>(arg);
|
||||
if (!env->destroy_async_id_list()->empty())
|
||||
AsyncWrap::DestroyAsyncIdsCallback(env, nullptr);
|
||||
},
|
||||
this);
|
||||
|
||||
performance_state_.reset(new performance::performance_state(isolate()));
|
||||
performance_state_->Mark(
|
||||
performance::NODE_PERFORMANCE_MILESTONE_ENVIRONMENT);
|
||||
|
||||
Reference in New Issue
Block a user