Skip to content

Commit 5a1841c

Browse files
Stephen Belangerfoxxyz
Stephen Belanger
authored andcommitted
async_hooks: eliminate native PromiseHook
PR-URL: nodejs#39135 Backport-PR-URL: nodejs#39742 Reviewed-By: Rich Trott <rtrott@gmail.com> Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com> Reviewed-By: Gerhard Stöbich <deb2001-github@yahoo.de>
1 parent 8e21bfd commit 5a1841c

File tree

5 files changed

+34
-453
lines changed

5 files changed

+34
-453
lines changed

lib/internal/async_hooks.js

+34-15
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ const {
5252
clearAsyncIdStack,
5353
} = async_wrap;
5454
// For performance reasons, only track Promises when a hook is enabled.
55-
const { enablePromiseHook, disablePromiseHook, setPromiseHooks } = async_wrap;
55+
const { setPromiseHooks } = async_wrap;
5656
// Properties in active_hooks are used to keep track of the set of hooks being
5757
// executed in case another hook is enabled/disabled. The new set of hooks is
5858
// then restored once the active set of hooks is finished executing.
@@ -307,9 +307,13 @@ function trackPromise(promise, parent) {
307307
return;
308308
}
309309

310-
promise[async_id_symbol] = newAsyncId();
311-
promise[trigger_async_id_symbol] = parent ? getOrSetAsyncId(parent) :
310+
// Get trigger id from parent async id before making the async id of the
311+
// child so if a new one must be made it will be lower than the child.
312+
const triggerAsyncId = parent ? getOrSetAsyncId(parent) :
312313
getDefaultTriggerAsyncId();
314+
315+
promise[async_id_symbol] = newAsyncId();
316+
promise[trigger_async_id_symbol] = triggerAsyncId;
313317
}
314318

315319
function promiseInitHook(promise, parent) {
@@ -319,6 +323,21 @@ function promiseInitHook(promise, parent) {
319323
emitInitScript(asyncId, 'PROMISE', triggerAsyncId, promise);
320324
}
321325

326+
function promiseInitHookWithDestroyTracking(promise, parent) {
327+
promiseInitHook(promise, parent);
328+
destroyTracking(promise, parent);
329+
}
330+
331+
const destroyedSymbol = Symbol('destroyed');
332+
333+
function destroyTracking(promise, parent) {
334+
trackPromise(promise, parent);
335+
const asyncId = promise[async_id_symbol];
336+
const destroyed = { destroyed: false };
337+
promise[destroyedSymbol] = destroyed;
338+
registerDestroyHook(promise, asyncId, destroyed);
339+
}
340+
322341
function promiseBeforeHook(promise) {
323342
trackPromise(promise);
324343
const asyncId = promise[async_id_symbol];
@@ -355,18 +374,19 @@ function enableHooks() {
355374

356375
function updatePromiseHookMode() {
357376
wantPromiseHook = true;
358-
if (destroyHooksExist()) {
359-
enablePromiseHook();
360-
setPromiseHooks(undefined, undefined, undefined, undefined);
361-
} else {
362-
disablePromiseHook();
363-
setPromiseHooks(
364-
initHooksExist() ? promiseInitHook : undefined,
365-
promiseBeforeHook,
366-
promiseAfterHook,
367-
promiseResolveHooksExist() ? promiseResolveHook : undefined,
368-
);
377+
let initHook;
378+
if (initHooksExist()) {
379+
initHook = destroyHooksExist() ? promiseInitHookWithDestroyTracking :
380+
promiseInitHook;
381+
} else if (destroyHooksExist()) {
382+
initHook = destroyTracking;
369383
}
384+
setPromiseHooks(
385+
initHook,
386+
promiseBeforeHook,
387+
promiseAfterHook,
388+
promiseResolveHooksExist() ? promiseResolveHook : undefined,
389+
);
370390
}
371391

372392
function disableHooks() {
@@ -381,7 +401,6 @@ function disableHooks() {
381401

382402
function disablePromiseHookIfNecessary() {
383403
if (!wantPromiseHook) {
384-
disablePromiseHook();
385404
setPromiseHooks(undefined, undefined, undefined, undefined);
386405
}
387406
}

0 commit comments

Comments
 (0)