diff options
author | Ruben Bridgewater <ruben@bridgewater.de> | 2018-05-07 05:25:26 +0300 |
---|---|---|
committer | Ruben Bridgewater <ruben@bridgewater.de> | 2018-05-18 16:32:10 +0300 |
commit | a3a14082fc7d254d0a8cf93f55b2c02c31afbb83 (patch) | |
tree | 08c6f4dd05b2b5e6cd8142839454aa0715b48551 /lib/internal/inspector_async_hook.js | |
parent | 17d95ea1f0be2204cc040b8b0a9d1144f28baaab (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.js | 62 |
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(); } |