lib: lazy loaded
This makes sure the async hooks and more is only loaded in case it is actually necessary. PR-URL: https://github.com/nodejs/node/pull/20567 Reviewed-By: Gus Caplan <me@gus.host> Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Jeremiah Senkpiel <fishrock123@rocketmail.com>
This commit is contained in:
parent
b4be89ffc1
commit
7cc303415c
@ -64,7 +64,17 @@
|
|||||||
if (global.__coverage__)
|
if (global.__coverage__)
|
||||||
NativeModule.require('internal/process/write-coverage').setup();
|
NativeModule.require('internal/process/write-coverage').setup();
|
||||||
|
|
||||||
NativeModule.require('internal/trace_events_async_hooks').setup();
|
|
||||||
|
{
|
||||||
|
const traceEvents = process.binding('trace_events');
|
||||||
|
const traceEventCategory = 'node,node.async_hooks';
|
||||||
|
|
||||||
|
if (traceEvents.categoryGroupEnabled(traceEventCategory)) {
|
||||||
|
NativeModule.require('internal/trace_events_async_hooks')
|
||||||
|
.setup(traceEvents, traceEventCategory);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if (process.config.variables.v8_enable_inspector) {
|
if (process.config.variables.v8_enable_inspector) {
|
||||||
NativeModule.require('internal/inspector_async_hook').setup();
|
NativeModule.require('internal/inspector_async_hook').setup();
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
const trace_events = process.binding('trace_events');
|
exports.setup = function(traceEvents, traceEventCategory) {
|
||||||
const async_wrap = process.binding('async_wrap');
|
const async_wrap = process.binding('async_wrap');
|
||||||
const async_hooks = require('async_hooks');
|
const async_hooks = require('async_hooks');
|
||||||
|
|
||||||
@ -10,26 +10,24 @@ const async_hooks = require('async_hooks');
|
|||||||
const BEFORE_EVENT = 'b'.charCodeAt(0);
|
const BEFORE_EVENT = 'b'.charCodeAt(0);
|
||||||
const END_EVENT = 'e'.charCodeAt(0);
|
const END_EVENT = 'e'.charCodeAt(0);
|
||||||
|
|
||||||
// In trace_events it is not only the id but also the name that needs to be
|
// In traceEvents it is not only the id but also the name that needs to be
|
||||||
// repeated. Since async_hooks doesn't expose the provider type in the
|
// repeated. Since async_hooks doesn't expose the provider type in the
|
||||||
// non-init events, use a map to manually map the asyncId to the type name.
|
// non-init events, use a map to manually map the asyncId to the type name.
|
||||||
const typeMemory = new Map();
|
const typeMemory = new Map();
|
||||||
|
|
||||||
const trace_event_category = 'node,node.async_hooks';
|
// It is faster to emit traceEvents directly from C++. Thus, this happens
|
||||||
|
// in async_wrap.cc. However, events emitted from the JavaScript API or the
|
||||||
// It is faster to emit trace_events directly from C++. Thus, this happens in
|
|
||||||
// async_wrap.cc. However, events emitted from the JavaScript API or the
|
|
||||||
// Embedder C++ API can't be emitted from async_wrap.cc. Thus they are
|
// Embedder C++ API can't be emitted from async_wrap.cc. Thus they are
|
||||||
// emitted using the JavaScript API. To prevent emitting the same event
|
// emitted using the JavaScript API. To prevent emitting the same event
|
||||||
// twice the async_wrap.Providers list is used to filter the events.
|
// twice the async_wrap.Providers list is used to filter the events.
|
||||||
const nativeProviders = new Set(Object.keys(async_wrap.Providers));
|
const nativeProviders = new Set(Object.keys(async_wrap.Providers));
|
||||||
|
|
||||||
const hook = async_hooks.createHook({
|
async_hooks.createHook({
|
||||||
init(asyncId, type, triggerAsyncId, resource) {
|
init(asyncId, type, triggerAsyncId, resource) {
|
||||||
if (nativeProviders.has(type)) return;
|
if (nativeProviders.has(type)) return;
|
||||||
|
|
||||||
typeMemory.set(asyncId, type);
|
typeMemory.set(asyncId, type);
|
||||||
trace_events.emit(BEFORE_EVENT, trace_event_category,
|
traceEvents.emit(BEFORE_EVENT, traceEventCategory,
|
||||||
type, asyncId,
|
type, asyncId,
|
||||||
'triggerAsyncId', triggerAsyncId,
|
'triggerAsyncId', triggerAsyncId,
|
||||||
'executionAsyncId', async_hooks.executionAsyncId());
|
'executionAsyncId', async_hooks.executionAsyncId());
|
||||||
@ -39,7 +37,7 @@ const hook = async_hooks.createHook({
|
|||||||
const type = typeMemory.get(asyncId);
|
const type = typeMemory.get(asyncId);
|
||||||
if (type === undefined) return;
|
if (type === undefined) return;
|
||||||
|
|
||||||
trace_events.emit(BEFORE_EVENT, trace_event_category,
|
traceEvents.emit(BEFORE_EVENT, traceEventCategory,
|
||||||
type + '_CALLBACK', asyncId);
|
type + '_CALLBACK', asyncId);
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -47,7 +45,7 @@ const hook = async_hooks.createHook({
|
|||||||
const type = typeMemory.get(asyncId);
|
const type = typeMemory.get(asyncId);
|
||||||
if (type === undefined) return;
|
if (type === undefined) return;
|
||||||
|
|
||||||
trace_events.emit(END_EVENT, trace_event_category,
|
traceEvents.emit(END_EVENT, traceEventCategory,
|
||||||
type + '_CALLBACK', asyncId);
|
type + '_CALLBACK', asyncId);
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -55,17 +53,11 @@ const hook = async_hooks.createHook({
|
|||||||
const type = typeMemory.get(asyncId);
|
const type = typeMemory.get(asyncId);
|
||||||
if (type === undefined) return;
|
if (type === undefined) return;
|
||||||
|
|
||||||
trace_events.emit(END_EVENT, trace_event_category,
|
traceEvents.emit(END_EVENT, traceEventCategory,
|
||||||
type, asyncId);
|
type, asyncId);
|
||||||
|
|
||||||
// cleanup asyncId to type map
|
// cleanup asyncId to type map
|
||||||
typeMemory.delete(asyncId);
|
typeMemory.delete(asyncId);
|
||||||
}
|
}
|
||||||
});
|
}).enable();
|
||||||
|
|
||||||
|
|
||||||
exports.setup = function() {
|
|
||||||
if (trace_events.categoryGroupEnabled(trace_event_category)) {
|
|
||||||
hook.enable();
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user