Skip to content

Commit

Permalink
async_hooks: make AsyncResource match emitInit
Browse files Browse the repository at this point in the history
AsyncResource previously called emitInitNative. Since AsyncResource is
just an abstraction on top of the emitEventScript functions, it should
call emitInitScript instead.

PR-URL: #14152
Reviewed-By: Refael Ackermann <refack@gmail.com>
Reviewed-By: Trevor Norris <trev.norris@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Anna Henningsen <anna@addaleax.net>
  • Loading branch information
AndreasMadsen authored and Fishrock123 committed Jul 19, 2017
1 parent 5436111 commit 7f87876
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 21 deletions.
27 changes: 9 additions & 18 deletions lib/async_hooks.js
Original file line number Diff line number Diff line change
Expand Up @@ -207,28 +207,16 @@ function triggerAsyncId() {
// Embedder API //

class AsyncResource {
constructor(type, triggerAsyncId) {
this[async_id_symbol] = ++async_uid_fields[kAsyncUidCntr];
// Read and reset the current kInitTriggerId so that when the constructor
// finishes the kInitTriggerId field is always 0.
if (triggerAsyncId === undefined) {
triggerAsyncId = initTriggerId();
// If a triggerAsyncId was passed, any kInitTriggerId still must be null'd.
} else {
async_uid_fields[kInitTriggerId] = 0;
}
this[trigger_id_symbol] = triggerAsyncId;

if (typeof type !== 'string' || type.length <= 0)
throw new TypeError('type must be a string with length > 0');
constructor(type, triggerAsyncId = initTriggerId()) {
// Unlike emitInitScript, AsyncResource doesn't supports null as the
// triggerAsyncId.
if (!Number.isSafeInteger(triggerAsyncId) || triggerAsyncId < 0)
throw new RangeError('triggerAsyncId must be an unsigned integer');

// Return immediately if there's nothing to do.
if (async_hook_fields[kInit] === 0)
return;
this[async_id_symbol] = ++async_uid_fields[kAsyncUidCntr];
this[trigger_id_symbol] = triggerAsyncId;

emitInitNative(this[async_id_symbol], type, triggerAsyncId, this);
emitInitScript(this[async_id_symbol], type, this[trigger_id_symbol], this);
}

emitBefore() {
Expand Down Expand Up @@ -323,6 +311,9 @@ function emitInitScript(asyncId, type, triggerAsyncId, resource) {
// manually means that the embedder must have used initTriggerId().
if (triggerAsyncId === null) {
triggerAsyncId = initTriggerId();
} else {
// If a triggerAsyncId was passed, any kInitTriggerId still must be null'd.
async_uid_fields[kInitTriggerId] = 0;
}

// TODO(trevnorris): I'd prefer allowing these checks to not exist, or only
Expand Down
4 changes: 2 additions & 2 deletions test/async-hooks/test-embedder.api.async-resource.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ assert.throws(() => new AsyncResource('invalid_trigger_id', null),
/^RangeError: triggerAsyncId must be an unsigned integer$/);

assert.strictEqual(
typeof new AsyncResource('default_trigger_id').triggerAsyncId(),
'number'
new AsyncResource('default_trigger_id').triggerAsyncId(),
async_hooks.executionAsyncId()
);

// create first custom event 'alcazares' with triggerAsyncId derived
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,13 @@ require('../common');
// This tests that AsyncResource throws an error if bad parameters are passed

const assert = require('assert');
const AsyncResource = require('async_hooks').AsyncResource;
const async_hooks = require('async_hooks');
const { AsyncResource } = async_hooks;

// Setup init hook such parameters are validated
async_hooks.createHook({
init() {}
}).enable();

assert.throws(() => {
return new AsyncResource();
Expand Down

0 comments on commit 7f87876

Please sign in to comment.