async_hooks: make AsyncResource match emitInit

AsyncResource previously called emitInitNative. Since AsyncResource is
just an abstraction on top of the emitEventScript functions, it should
call emitInitScript instead.

PR-URL: https://github.com/nodejs/node/pull/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>
This commit is contained in:
Andreas Madsen 2017-07-10 14:28:33 +02:00
parent 628485ea01
commit 31417b6882
No known key found for this signature in database
GPG Key ID: 2FEE61B3C9E40F20
3 changed files with 18 additions and 21 deletions

View File

@ -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() {
@ -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

View File

@ -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

View File

@ -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();