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 <jasnell@gmail.com> Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
This commit is contained in:
parent
f734b3eb04
commit
f7f1437d44
@ -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<v8::Value> AsyncWrap::MakeCallback(
|
||||
const v8::Local<v8::String> symbol,
|
||||
int argc,
|
||||
|
@ -169,6 +169,18 @@ class AsyncWrap : public BaseObject {
|
||||
|
||||
static void WeakCallback(const v8::WeakCallbackInfo<DestroyParam> &info);
|
||||
|
||||
// This is a simplified version of InternalCallbackScope that only runs
|
||||
// the `before` and `after` hooks. Only use it when not actually calling
|
||||
// back into JS; otherwise, use InternalCallbackScope.
|
||||
class AsyncScope {
|
||||
public:
|
||||
explicit inline AsyncScope(AsyncWrap* wrap);
|
||||
~AsyncScope();
|
||||
|
||||
private:
|
||||
AsyncWrap* wrap_ = nullptr;
|
||||
};
|
||||
|
||||
private:
|
||||
friend class PromiseWrap;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user