@@ -202,13 +202,13 @@ void AsyncWrap::EmitBefore(Environment* env, double async_id) {
202
202
}
203
203
204
204
205
- void AsyncWrap::EmitTraceEventAfter () {
206
- switch (provider_type () ) {
205
+ void AsyncWrap::EmitTraceEventAfter (ProviderType type, double async_id ) {
206
+ switch (type ) {
207
207
#define V (PROVIDER ) \
208
208
case PROVIDER_ ## PROVIDER: \
209
209
TRACE_EVENT_NESTABLE_ASYNC_END0 ( \
210
210
TRACING_CATEGORY_NODE1 (async_hooks), \
211
- #PROVIDER " _CALLBACK" , static_cast <int64_t >(get_async_id ())); \
211
+ #PROVIDER " _CALLBACK" , static_cast <int64_t >(async_id)); \
212
212
break ;
213
213
NODE_ASYNC_PROVIDER_TYPES (V)
214
214
#undef V
@@ -314,7 +314,7 @@ static void PromiseHook(PromiseHookType type, Local<Promise> promise,
314
314
wrap->EmitTraceEventBefore ();
315
315
AsyncWrap::EmitBefore (wrap->env (), wrap->get_async_id ());
316
316
} else if (type == PromiseHookType::kAfter ) {
317
- wrap->EmitTraceEventAfter ();
317
+ wrap->EmitTraceEventAfter (wrap-> provider_type (), wrap-> get_async_id () );
318
318
AsyncWrap::EmitAfter (wrap->env (), wrap->get_async_id ());
319
319
if (env->execution_async_id () == wrap->get_async_id ()) {
320
320
// This condition might not be true if async_hooks was enabled during
@@ -701,11 +701,14 @@ MaybeLocal<Value> AsyncWrap::MakeCallback(const Local<Function> cb,
701
701
Local<Value>* argv) {
702
702
EmitTraceEventBefore ();
703
703
704
+ ProviderType provider = provider_type ();
704
705
async_context context { get_async_id (), get_trigger_async_id () };
705
706
MaybeLocal<Value> ret = InternalMakeCallback (
706
707
env (), object (), cb, argc, argv, context);
707
708
708
- EmitTraceEventAfter ();
709
+ // This is a static call with cached values because the `this` object may
710
+ // no longer be alive at this point.
711
+ EmitTraceEventAfter (provider, context.async_id );
709
712
710
713
return ret;
711
714
}
0 commit comments