Browse Source

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>
v5.x
Andreas Madsen 9 years ago
committed by Rod Vagg
parent
commit
4afe801f90
  1. 5
      src/async-wrap.cc
  2. 57
      test/parallel/test-async-wrap-uid.js

5
src/async-wrap.cc

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

@ -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…
Cancel
Save