From b9c739940772f2745e4fdf6c2951fd7c7d3c7be0 Mon Sep 17 00:00:00 2001 From: Stephen Toub Date: Thu, 17 Oct 2019 11:32:29 -0400 Subject: [PATCH] Enable ETW/EventSource logging of task IDs for boxed state machines (#27115) (#27217) * Wrap MoveNext Action for TPL event tracing Wraps the MoveNext action of the AsyncStateMachineBox in a continuation wrapper when async causality tracing is on so that the TPL event source can find the task that is associated with a continuation. Does not wrap otherwise. * Clarifying comment * removing trailing whitespace * code review feedback. Makes AsyncMethodBuilderCore.TryFindContinuationTask check to whether the target of a continuation is itself a task, as a fall-back to checking to see if the continuation is a ContinuationWrapper * Got rid of unnecessary null checks --- .../shared/System/Runtime/CompilerServices/AsyncMethodBuilder.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/System.Private.CoreLib/shared/System/Runtime/CompilerServices/AsyncMethodBuilder.cs b/src/System.Private.CoreLib/shared/System/Runtime/CompilerServices/AsyncMethodBuilder.cs index 97c0535..a250648 100644 --- a/src/System.Private.CoreLib/shared/System/Runtime/CompilerServices/AsyncMethodBuilder.cs +++ b/src/System.Private.CoreLib/shared/System/Runtime/CompilerServices/AsyncMethodBuilder.cs @@ -1099,7 +1099,9 @@ namespace System.Runtime.CompilerServices } internal static Task? TryGetContinuationTask(Action continuation) => - (continuation?.Target as ContinuationWrapper)?._innerTask; + (continuation.Target is ContinuationWrapper wrapper) ? + wrapper._innerTask : // A wrapped continuation, created by an awaiter + continuation.Target as Task; // The continuation targets a task directly, such as with AsyncStateMachineBox /// /// Logically we pass just an Action (delegate) to a task for its action to 'ContinueWith' when it completes. -- 2.7.4