Browse Source

async_wrap: allow some hooks to be optional

Only enforce that the init callback is passed to setupHooks(). The
remaining hooks can be optionally passed.

Throw if async_wrap.enable() runs before setting the init callback or if
setupHooks() is called while async wrap is enabled.

Add test to verify calls throw appropriately.

PR-URL: https://github.com/nodejs/node/pull/3461
Reviewed-By: Fedor Indutny <fedor@indutny.com>
v4.x
Trevor Norris 9 years ago
committed by Myles Borins
parent
commit
49f16d77c4
  1. 18
      src/async-wrap.cc
  2. 22
      test/parallel/test-async-wrap-throw-no-init.js

18
src/async-wrap.cc

@ -103,6 +103,9 @@ RetainedObjectInfo* WrapperInfo(uint16_t class_id, Local<Value> wrapper) {
static void EnableHooksJS(const FunctionCallbackInfo<Value>& args) {
Environment* env = Environment::GetCurrent(args);
Local<Function> init_fn = env->async_hooks_init_function();
if (init_fn.IsEmpty() || !init_fn->IsFunction())
return env->ThrowTypeError("init callback is not assigned to a function");
env->async_hooks()->set_enable_callbacks(1);
}
@ -116,13 +119,18 @@ static void DisableHooksJS(const FunctionCallbackInfo<Value>& args) {
static void SetupHooks(const FunctionCallbackInfo<Value>& args) {
Environment* env = Environment::GetCurrent(args);
CHECK(args[0]->IsFunction());
CHECK(args[1]->IsFunction());
CHECK(args[2]->IsFunction());
if (env->async_hooks()->callbacks_enabled())
return env->ThrowError("hooks should not be set while also enabled");
if (!args[0]->IsFunction())
return env->ThrowTypeError("init callback must be a function");
env->set_async_hooks_init_function(args[0].As<Function>());
env->set_async_hooks_pre_function(args[1].As<Function>());
env->set_async_hooks_post_function(args[2].As<Function>());
if (args[1]->IsFunction())
env->set_async_hooks_pre_function(args[1].As<Function>());
if (args[2]->IsFunction())
env->set_async_hooks_post_function(args[2].As<Function>());
}

22
test/parallel/test-async-wrap-throw-no-init.js

@ -0,0 +1,22 @@
'use strict';
const common = require('../common');
const assert = require('assert');
const async_wrap = process.binding('async_wrap');
assert.throws(function() {
async_wrap.setupHooks(null);
}, /init callback must be a function/);
assert.throws(function() {
async_wrap.enable();
}, /init callback is not assigned to a function/);
// Should not throw
async_wrap.setupHooks(() => {});
async_wrap.enable();
assert.throws(function() {
async_wrap.setupHooks(() => {});
}, /hooks should not be set while also enabled/);
Loading…
Cancel
Save