1 // Licensed to the .NET Foundation under one or more agreements.
2 // The .NET Foundation licenses this file to you under the MIT license.
3 // See the LICENSE file in the project root for more information.
4 
5 using TaskTraceCallbacks = Internal.Runtime.Augments.TaskTraceCallbacks;
6 
7 namespace Internal.Threading.Tasks.Tracing
8 {
9     /// <summary>
10     /// Helper class for reporting <see cref="System.Threading.Tasks.Task"/>-related events.
11     /// Calls are forwarded to an instance of <see cref="TaskTraceCallbacks"/>, if one has been
12     /// provided.
13     /// </summary>
14     public static class TaskTrace
15     {
16         private static TaskTraceCallbacks s_callbacks;
17 
18         public static bool Enabled
19         {
20             get
21             {
22                 TaskTraceCallbacks callbacks = s_callbacks;
23                 if (callbacks == null)
24                     return false;
25                 if (!callbacks.Enabled)
26                     return false;
27                 return true;
28             }
29         }
30 
Initialize(TaskTraceCallbacks callbacks)31         public static void Initialize(TaskTraceCallbacks callbacks)
32         {
33             s_callbacks = callbacks;
34         }
35 
TaskWaitBegin_Asynchronous( int OriginatingTaskSchedulerID, int OriginatingTaskID, int TaskID)36         public static void TaskWaitBegin_Asynchronous(
37             int OriginatingTaskSchedulerID,
38             int OriginatingTaskID,
39             int TaskID)
40         {
41             TaskTraceCallbacks callbacks = s_callbacks;
42             if (callbacks == null)
43                 return;
44             callbacks.TaskWaitBegin_Asynchronous(OriginatingTaskSchedulerID, OriginatingTaskID, TaskID);
45         }
46 
TaskWaitBegin_Synchronous( int OriginatingTaskSchedulerID, int OriginatingTaskID, int TaskID)47         public static void TaskWaitBegin_Synchronous(
48             int OriginatingTaskSchedulerID,
49             int OriginatingTaskID,
50             int TaskID)
51         {
52             TaskTraceCallbacks callbacks = s_callbacks;
53             if (callbacks == null)
54                 return;
55             callbacks.TaskWaitBegin_Synchronous(OriginatingTaskSchedulerID, OriginatingTaskID, TaskID);
56         }
57 
TaskWaitEnd( int OriginatingTaskSchedulerID, int OriginatingTaskID, int TaskID)58         public static void TaskWaitEnd(
59             int OriginatingTaskSchedulerID,
60             int OriginatingTaskID,
61             int TaskID)
62         {
63             TaskTraceCallbacks callbacks = s_callbacks;
64             if (callbacks == null)
65                 return;
66             callbacks.TaskWaitEnd(OriginatingTaskSchedulerID, OriginatingTaskID, TaskID);
67         }
68 
TaskScheduled( int OriginatingTaskSchedulerID, int OriginatingTaskID, int TaskID, int CreatingTaskID, int TaskCreationOptions)69         public static void TaskScheduled(
70             int OriginatingTaskSchedulerID,
71             int OriginatingTaskID,
72             int TaskID,
73             int CreatingTaskID,
74             int TaskCreationOptions)
75         {
76             TaskTraceCallbacks callbacks = s_callbacks;
77             if (callbacks == null)
78                 return;
79             callbacks.TaskScheduled(OriginatingTaskSchedulerID, OriginatingTaskID, TaskID, CreatingTaskID, TaskCreationOptions);
80         }
81 
TaskStarted( int OriginatingTaskSchedulerID, int OriginatingTaskID, int TaskID)82         public static void TaskStarted(
83             int OriginatingTaskSchedulerID,
84             int OriginatingTaskID,
85             int TaskID)
86         {
87             TaskTraceCallbacks callbacks = s_callbacks;
88             if (callbacks == null)
89                 return;
90             callbacks.TaskStarted(OriginatingTaskSchedulerID, OriginatingTaskID, TaskID);
91         }
92 
TaskCompleted( int OriginatingTaskSchedulerID, int OriginatingTaskID, int TaskID, bool IsExceptional)93         public static void TaskCompleted(
94             int OriginatingTaskSchedulerID,
95             int OriginatingTaskID,
96             int TaskID,
97             bool IsExceptional)
98         {
99             TaskTraceCallbacks callbacks = s_callbacks;
100             if (callbacks == null)
101                 return;
102             callbacks.TaskCompleted(OriginatingTaskSchedulerID, OriginatingTaskID, TaskID, IsExceptional);
103         }
104     }
105 }