Skip to content

Commit

Permalink
async_wrap: add uid to all asyncWrap hooks
Browse files Browse the repository at this point in the history
By doing this users can use a Map object for storing information
instead of modifying the handle object.

Ref: #7048
PR-URL: #4600
Reviewed-By: Trevor Norris <trev.norris@gmail.com>
Reviewed-By: Sakthipriyan Vairamani <thechargingvolcano@gmail.com>
  • Loading branch information
AndreasMadsen authored and Myles Borins committed Jun 24, 2016
1 parent 031b8ce commit 1e856e5
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 2 deletions.
5 changes: 3 additions & 2 deletions src/async-wrap.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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");
}

Expand Down
57 changes: 57 additions & 0 deletions test/parallel/test-async-wrap-uid.js
Original file line number Diff line number Diff line change
@@ -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
});
}
});

0 comments on commit 1e856e5

Please sign in to comment.