async_wrap: add uid to all asyncWrap hooks
By doing this users can use a Map object for storing information instead of modifying the handle object. PR-URL: https://github.com/nodejs/node/pull/4600 Reviewed-By: Trevor Norris <trev.norris@gmail.com> Reviewed-By: Sakthipriyan Vairamani <thechargingvolcano@gmail.com>
This commit is contained in:
parent
2ba7baac93
commit
c794869e97
@ -179,6 +179,7 @@ Local<Value> AsyncWrap::MakeCallback(const Local<Function> cb,
|
||||
|
||||
Local<Function> pre_fn = env()->async_hooks_pre_function();
|
||||
Local<Function> post_fn = env()->async_hooks_post_function();
|
||||
Local<Value> uid = Integer::New(env()->isolate(), get_uid());
|
||||
Local<Object> context = object();
|
||||
Local<Object> process = env()->process_object();
|
||||
Local<Object> domain;
|
||||
@ -207,14 +208,14 @@ Local<Value> AsyncWrap::MakeCallback(const Local<Function> cb,
|
||||
}
|
||||
|
||||
if (ran_init_callback() && !pre_fn.IsEmpty()) {
|
||||
if (pre_fn->Call(context, 0, nullptr).IsEmpty())
|
||||
if (pre_fn->Call(context, 1, &uid).IsEmpty())
|
||||
FatalError("node::AsyncWrap::MakeCallback", "pre hook threw");
|
||||
}
|
||||
|
||||
Local<Value> ret = cb->Call(context, argc, argv);
|
||||
|
||||
if (ran_init_callback() && !post_fn.IsEmpty()) {
|
||||
if (post_fn->Call(context, 0, nullptr).IsEmpty())
|
||||
if (post_fn->Call(context, 1, &uid).IsEmpty())
|
||||
FatalError("node::AsyncWrap::MakeCallback", "post hook threw");
|
||||
}
|
||||
|
||||
|
57
test/parallel/test-async-wrap-uid.js
Normal file
57
test/parallel/test-async-wrap-uid.js
Normal file
@ -0,0 +1,57 @@
|
||||
'use strict';
|
||||
|
||||
require('../common');
|
||||
const fs = require('fs');
|
||||
const assert = require('assert');
|
||||
const async_wrap = process.binding('async_wrap');
|
||||
|
||||
const storage = new Map();
|
||||
async_wrap.setupHooks(init, pre, post, destroy);
|
||||
async_wrap.enable();
|
||||
|
||||
function init(provider, uid) {
|
||||
storage.set(uid, {
|
||||
init: true,
|
||||
pre: false,
|
||||
post: false,
|
||||
destroy: false
|
||||
});
|
||||
}
|
||||
|
||||
function pre(uid) {
|
||||
storage.get(uid).pre = true;
|
||||
}
|
||||
|
||||
function post(uid) {
|
||||
storage.get(uid).post = true;
|
||||
}
|
||||
|
||||
function destroy(uid) {
|
||||
storage.get(uid).destroy = true;
|
||||
}
|
||||
|
||||
fs.access(__filename, function(err) {
|
||||
assert.ifError(err);
|
||||
});
|
||||
|
||||
fs.access(__filename, function(err) {
|
||||
assert.ifError(err);
|
||||
});
|
||||
|
||||
async_wrap.disable();
|
||||
|
||||
process.once('exit', function() {
|
||||
assert.strictEqual(storage.size, 2);
|
||||
|
||||
for (const item of storage) {
|
||||
const uid = item[0];
|
||||
const value = item[1];
|
||||
assert.strictEqual(typeof uid, 'number');
|
||||
assert.deepStrictEqual(value, {
|
||||
init: true,
|
||||
pre: true,
|
||||
post: true,
|
||||
destroy: true
|
||||
});
|
||||
}
|
||||
});
|
Loading…
x
Reference in New Issue
Block a user