Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nodejs/node.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuben Bridgewater <ruben@bridgewater.de>2018-05-07 05:25:26 +0300
committerRuben Bridgewater <ruben@bridgewater.de>2018-05-18 16:32:10 +0300
commita3a14082fc7d254d0a8cf93f55b2c02c31afbb83 (patch)
tree08c6f4dd05b2b5e6cd8142839454aa0715b48551 /lib/internal/inspector_async_hook.js
parent17d95ea1f0be2204cc040b8b0a9d1144f28baaab (diff)
async_hooks: lazy loading for startup performance
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>
Diffstat (limited to 'lib/internal/inspector_async_hook.js')
-rw-r--r--lib/internal/inspector_async_hook.js62
1 files changed, 35 insertions, 27 deletions
diff --git a/lib/internal/inspector_async_hook.js b/lib/internal/inspector_async_hook.js
index b190ff90b8e..6a7489af974 100644
--- a/lib/internal/inspector_async_hook.js
+++ b/lib/internal/inspector_async_hook.js
@@ -1,49 +1,56 @@
'use strict';
-const { createHook } = require('async_hooks');
const inspector = process.binding('inspector');
-const config = process.binding('config');
if (!inspector || !inspector.asyncTaskScheduled) {
exports.setup = function() {};
return;
}
-const hook = createHook({
- init(asyncId, type, triggerAsyncId, resource) {
+let hook;
+let config;
+
+function lazyHookCreation() {
+ const { createHook } = require('async_hooks');
+ config = process.binding('config');
+
+ hook = createHook({
+ init(asyncId, type, triggerAsyncId, resource) {
// It's difficult to tell which tasks will be recurring and which won't,
// therefore we mark all tasks as recurring. Based on the discussion
// in https://github.com/nodejs/node/pull/13870#discussion_r124515293,
// this should be fine as long as we call asyncTaskCanceled() too.
- const recurring = true;
- if (type === 'PROMISE')
- this.promiseIds.add(asyncId);
- else
- inspector.asyncTaskScheduled(type, asyncId, recurring);
- },
+ const recurring = true;
+ if (type === 'PROMISE')
+ this.promiseIds.add(asyncId);
+ else
+ inspector.asyncTaskScheduled(type, asyncId, recurring);
+ },
- before(asyncId) {
- if (this.promiseIds.has(asyncId))
- return;
- inspector.asyncTaskStarted(asyncId);
- },
+ before(asyncId) {
+ if (this.promiseIds.has(asyncId))
+ return;
+ inspector.asyncTaskStarted(asyncId);
+ },
- after(asyncId) {
- if (this.promiseIds.has(asyncId))
- return;
- inspector.asyncTaskFinished(asyncId);
- },
+ after(asyncId) {
+ if (this.promiseIds.has(asyncId))
+ return;
+ inspector.asyncTaskFinished(asyncId);
+ },
- destroy(asyncId) {
- if (this.promiseIds.has(asyncId))
- return this.promiseIds.delete(asyncId);
- inspector.asyncTaskCanceled(asyncId);
- },
-});
+ destroy(asyncId) {
+ if (this.promiseIds.has(asyncId))
+ return this.promiseIds.delete(asyncId);
+ inspector.asyncTaskCanceled(asyncId);
+ },
+ });
-hook.promiseIds = new Set();
+ hook.promiseIds = new Set();
+}
function enable() {
+ if (hook === undefined) lazyHookCreation();
if (config.bits < 64) {
// V8 Inspector stores task ids as (void*) pointers.
// async_hooks store ids as 64bit numbers.
@@ -61,6 +68,7 @@ function enable() {
}
function disable() {
+ if (hook === undefined) lazyHookCreation();
hook.disable();
}