From f7f1437d44f3e4b745e36540a752065cc58d993b Mon Sep 17 00:00:00 2001 From: Anna Henningsen Date: Wed, 7 Mar 2018 17:55:24 +0100 Subject: src: add helper for before/after scope without JS calls Add `AsyncScope` for cases where the async_hooks `before` and `after` callbacks should be called, to track async context, but no actual JS is called in between and we can therefore skip things like draining the microtask or `nextTick` queues. PR-URL: https://github.com/nodejs/node/pull/18936 Reviewed-By: James M Snell Reviewed-By: Matteo Collina --- src/async_wrap-inl.h | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'src/async_wrap-inl.h') diff --git a/src/async_wrap-inl.h b/src/async_wrap-inl.h index 21b1f9cee9f..c9f12333243 100644 --- a/src/async_wrap-inl.h +++ b/src/async_wrap-inl.h @@ -45,6 +45,22 @@ inline double AsyncWrap::get_trigger_async_id() const { } +inline AsyncWrap::AsyncScope::AsyncScope(AsyncWrap* wrap) + : wrap_(wrap) { + Environment* env = wrap->env(); + if (env->async_hooks()->fields()[Environment::AsyncHooks::kBefore] == 0) + return; + EmitBefore(env, wrap->get_async_id()); +} + +inline AsyncWrap::AsyncScope::~AsyncScope() { + Environment* env = wrap_->env(); + if (env->async_hooks()->fields()[Environment::AsyncHooks::kAfter] == 0) + return; + EmitAfter(env, wrap_->get_async_id()); +} + + inline v8::MaybeLocal AsyncWrap::MakeCallback( const v8::Local symbol, int argc, -- cgit v1.2.3