perf_hooks: invoke performance_entry_callback via MakeSyncCallback()

It's desirable to retain async_contexts active at callsites of
perf_hooks.performance.mark() and alike in the subsequent
PerformanceObserver invocations such that the latter can access e.g.
associated AsyncLocalStorage instances.

In working towards this goal replace the node::MakeCallback(...,
async_context{0, 0}) in PerformanceEntry::doNotify() by the new
node::MakeSyncCallback() introduced specifically for this purpose.

This change will retain the original async_context, if any, in
perf_hook's observersCallback() and thus, for the subsequent doNotify()
on unbuffered PerformanceObservers.

Co-Authored-By: ZauberNerd <zaubernerd@zaubernerd.de>

PR-URL: https://github.com/nodejs/node/pull/36343
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Rich Trott <rtrott@gmail.com>
pull/36343/head
Nicolai Stange 2020-11-29 03:11:30 +01:00 committed by Rich Trott
parent 348a3adacb
commit c53ba1f618
1 changed files with 4 additions and 5 deletions

View File

@ -159,11 +159,10 @@ void PerformanceEntry::Notify(Environment* env,
AliasedUint32Array& observers = env->performance_state()->observers;
if (!env->performance_entry_callback().IsEmpty() &&
type != NODE_PERFORMANCE_ENTRY_TYPE_INVALID && observers[type]) {
node::MakeCallback(env->isolate(),
object.As<Object>(),
env->performance_entry_callback(),
1, &object,
node::async_context{0, 0});
node::MakeSyncCallback(env->isolate(),
object.As<Object>(),
env->performance_entry_callback(),
1, &object);
}
}