summaryrefslogtreecommitdiff
path: root/src/mscorlib/src/System/Diagnostics/Eventing/FrameworkEventSource.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/mscorlib/src/System/Diagnostics/Eventing/FrameworkEventSource.cs')
-rw-r--r--src/mscorlib/src/System/Diagnostics/Eventing/FrameworkEventSource.cs620
1 files changed, 620 insertions, 0 deletions
diff --git a/src/mscorlib/src/System/Diagnostics/Eventing/FrameworkEventSource.cs b/src/mscorlib/src/System/Diagnostics/Eventing/FrameworkEventSource.cs
new file mode 100644
index 0000000000..6d3e28fcab
--- /dev/null
+++ b/src/mscorlib/src/System/Diagnostics/Eventing/FrameworkEventSource.cs
@@ -0,0 +1,620 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+//
+// ResourcesEtwProvider.cs
+//
+//
+// Managed event source for things that can version with MSCORLIB.
+//
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Reflection;
+using System.Text;
+using System.Runtime.CompilerServices;
+
+namespace System.Diagnostics.Tracing {
+
+ // To use the framework provider
+ //
+ // \\clrmain\tools\Perfmonitor /nokernel /noclr /provider:8E9F5090-2D75-4d03-8A81-E5AFBF85DAF1 start
+ // Run run your app
+ // \\clrmain\tools\Perfmonitor stop
+ // \\clrmain\tools\Perfmonitor print
+ //
+ // This will produce an XML file, where each event is pretty-printed with all its arguments nicely parsed.
+ //
+ [FriendAccessAllowed]
+ [EventSource(Guid = "8E9F5090-2D75-4d03-8A81-E5AFBF85DAF1", Name = "System.Diagnostics.Eventing.FrameworkEventSource")]
+ sealed internal class FrameworkEventSource : EventSource {
+ // Defines the singleton instance for the Resources ETW provider
+ public static readonly FrameworkEventSource Log = new FrameworkEventSource();
+
+ // Keyword definitions. These represent logical groups of events that can be turned on and off independently
+ // Often each task has a keyword, but where tasks are determined by subsystem, keywords are determined by
+ // usefulness to end users to filter. Generally users don't mind extra events if they are not high volume
+ // so grouping low volume events together in a single keywords is OK (users can post-filter by task if desired)
+ public static class Keywords {
+ public const EventKeywords Loader = (EventKeywords)0x0001; // This is bit 0
+ public const EventKeywords ThreadPool = (EventKeywords)0x0002;
+ public const EventKeywords NetClient = (EventKeywords)0x0004;
+ //
+ // This is a private event we do not want to expose to customers. It is to be used for profiling
+ // uses of dynamic type loading by ProjectN applications running on the desktop CLR
+ //
+ public const EventKeywords DynamicTypeUsage = (EventKeywords)0x0008;
+ public const EventKeywords ThreadTransfer = (EventKeywords)0x0010;
+ }
+
+ /// <summary>ETW tasks that have start/stop events.</summary>
+ [FriendAccessAllowed]
+ public static class Tasks // this name is important for EventSource
+ {
+ /// <summary>Begin / End - GetResponse.</summary>
+ public const EventTask GetResponse = (EventTask)1;
+ /// <summary>Begin / End - GetRequestStream</summary>
+ public const EventTask GetRequestStream = (EventTask)2;
+ /// <summary>Send / Receive - begin transfer/end transfer</summary>
+ public const EventTask ThreadTransfer = (EventTask)3;
+ }
+
+ [FriendAccessAllowed]
+ public static class Opcodes
+ {
+ public const EventOpcode ReceiveHandled = (EventOpcode)11;
+ }
+
+ // This predicate is used by consumers of this class to deteremine if the class has actually been initialized,
+ // and therefore if the public statics are available for use. This is typically not a problem... if the static
+ // class constructor fails, then attempts to access the statics (or even this property) will result in a
+ // TypeInitializationException. However, that is not the case while the class loader is actually trying to construct
+ // the TypeInitializationException instance to represent that failure, and some consumers of this class are on
+ // that code path, specifically the resource manager.
+ public static bool IsInitialized
+ {
+ get
+ {
+ return Log != null;
+ }
+ }
+
+ // The FrameworkEventSource GUID is {8E9F5090-2D75-4d03-8A81-E5AFBF85DAF1}
+ private FrameworkEventSource() : base(new Guid(0x8e9f5090, 0x2d75, 0x4d03, 0x8a, 0x81, 0xe5, 0xaf, 0xbf, 0x85, 0xda, 0xf1), "System.Diagnostics.Eventing.FrameworkEventSource") { }
+
+ // WriteEvent overloads (to avoid the "params" EventSource.WriteEvent
+
+ // optimized for common signatures (used by the ThreadTransferSend/Receive events)
+ [NonEvent, System.Security.SecuritySafeCritical]
+ [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Concurrency", "CA8001", Justification = "This does not need to be correct when racing with other threads")]
+ private unsafe void WriteEvent(int eventId, long arg1, int arg2, string arg3, bool arg4)
+ {
+ if (IsEnabled())
+ {
+ if (arg3 == null) arg3 = "";
+ fixed (char* string3Bytes = arg3)
+ {
+ EventSource.EventData* descrs = stackalloc EventSource.EventData[4];
+ descrs[0].DataPointer = (IntPtr)(&arg1);
+ descrs[0].Size = 8;
+ descrs[1].DataPointer = (IntPtr)(&arg2);
+ descrs[1].Size = 4;
+ descrs[2].DataPointer = (IntPtr)string3Bytes;
+ descrs[2].Size = ((arg3.Length + 1) * 2);
+ descrs[3].DataPointer = (IntPtr)(&arg4);
+ descrs[3].Size = 4;
+ WriteEventCore(eventId, 4, descrs);
+ }
+ }
+ }
+
+ // optimized for common signatures (used by the ThreadTransferSend/Receive events)
+ [NonEvent, System.Security.SecuritySafeCritical]
+ [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Concurrency", "CA8001", Justification = "This does not need to be correct when racing with other threads")]
+ private unsafe void WriteEvent(int eventId, long arg1, int arg2, string arg3)
+ {
+ if (IsEnabled())
+ {
+ if (arg3 == null) arg3 = "";
+ fixed (char* string3Bytes = arg3)
+ {
+ EventSource.EventData* descrs = stackalloc EventSource.EventData[3];
+ descrs[0].DataPointer = (IntPtr)(&arg1);
+ descrs[0].Size = 8;
+ descrs[1].DataPointer = (IntPtr)(&arg2);
+ descrs[1].Size = 4;
+ descrs[2].DataPointer = (IntPtr)string3Bytes;
+ descrs[2].Size = ((arg3.Length + 1) * 2);
+ WriteEventCore(eventId, 3, descrs);
+ }
+ }
+ }
+
+ // optimized for common signatures (used by the BeginGetResponse/BeginGetRequestStream events)
+ [NonEvent, System.Security.SecuritySafeCritical]
+ [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Concurrency", "CA8001", Justification = "This does not need to be correct when racing with other threads")]
+ private unsafe void WriteEvent(int eventId, long arg1, string arg2, bool arg3, bool arg4)
+ {
+ if (IsEnabled())
+ {
+ if (arg2 == null) arg2 = "";
+ fixed (char* string2Bytes = arg2)
+ {
+ EventSource.EventData* descrs = stackalloc EventSource.EventData[4];
+ descrs[0].DataPointer = (IntPtr)(&arg1);
+ descrs[0].Size = 8;
+ descrs[1].DataPointer = (IntPtr)string2Bytes;
+ descrs[1].Size = ((arg2.Length + 1) * 2);
+ descrs[2].DataPointer = (IntPtr)(&arg3);
+ descrs[2].Size = 4;
+ descrs[3].DataPointer = (IntPtr)(&arg4);
+ descrs[3].Size = 4;
+ WriteEventCore(eventId, 4, descrs);
+ }
+ }
+ }
+
+ // optimized for common signatures (used by the EndGetRequestStream event)
+ [NonEvent, System.Security.SecuritySafeCritical]
+ [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Concurrency", "CA8001", Justification = "This does not need to be correct when racing with other threads")]
+ private unsafe void WriteEvent(int eventId, long arg1, bool arg2, bool arg3)
+ {
+ if (IsEnabled())
+ {
+ EventSource.EventData* descrs = stackalloc EventSource.EventData[3];
+ descrs[0].DataPointer = (IntPtr)(&arg1);
+ descrs[0].Size = 8;
+ descrs[1].DataPointer = (IntPtr)(&arg2);
+ descrs[1].Size = 4;
+ descrs[2].DataPointer = (IntPtr)(&arg3);
+ descrs[2].Size = 4;
+ WriteEventCore(eventId, 3, descrs);
+ }
+ }
+
+ // optimized for common signatures (used by the EndGetResponse event)
+ [NonEvent, System.Security.SecuritySafeCritical]
+ [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Concurrency", "CA8001", Justification = "This does not need to be correct when racing with other threads")]
+ private unsafe void WriteEvent(int eventId, long arg1, bool arg2, bool arg3, int arg4)
+ {
+ if (IsEnabled())
+ {
+ EventSource.EventData* descrs = stackalloc EventSource.EventData[4];
+ descrs[0].DataPointer = (IntPtr)(&arg1);
+ descrs[0].Size = 8;
+ descrs[1].DataPointer = (IntPtr)(&arg2);
+ descrs[1].Size = 4;
+ descrs[2].DataPointer = (IntPtr)(&arg3);
+ descrs[2].Size = 4;
+ descrs[3].DataPointer = (IntPtr)(&arg4);
+ descrs[3].Size = 4;
+ WriteEventCore(eventId, 4, descrs);
+ }
+ }
+
+ // ResourceManager Event Definitions
+
+ [Event(1, Level = EventLevel.Informational, Keywords = Keywords.Loader)]
+ public void ResourceManagerLookupStarted(String baseName, String mainAssemblyName, String cultureName) {
+ WriteEvent(1, baseName, mainAssemblyName, cultureName);
+ }
+
+ [Event(2, Level = EventLevel.Informational, Keywords = Keywords.Loader)]
+ public void ResourceManagerLookingForResourceSet(String baseName, String mainAssemblyName, String cultureName) {
+ if (IsEnabled())
+ WriteEvent(2, baseName, mainAssemblyName, cultureName);
+ }
+
+ [Event(3, Level = EventLevel.Informational, Keywords = Keywords.Loader)]
+ public void ResourceManagerFoundResourceSetInCache(String baseName, String mainAssemblyName, String cultureName) {
+ if (IsEnabled())
+ WriteEvent(3, baseName, mainAssemblyName, cultureName);
+ }
+
+ // After loading a satellite assembly, we already have the ResourceSet for this culture in
+ // the cache. This can happen if you have an assembly load callback that called into this
+ // instance of the ResourceManager.
+ [Event(4, Level = EventLevel.Warning, Keywords = Keywords.Loader)]
+ public void ResourceManagerFoundResourceSetInCacheUnexpected(String baseName, String mainAssemblyName, String cultureName) {
+ if (IsEnabled())
+ WriteEvent(4, baseName, mainAssemblyName, cultureName);
+ }
+
+ // manifest resource stream lookup succeeded
+ [Event(5, Level = EventLevel.Informational, Keywords = Keywords.Loader)]
+ public void ResourceManagerStreamFound(String baseName, String mainAssemblyName, String cultureName, String loadedAssemblyName, String resourceFileName) {
+ if (IsEnabled())
+ WriteEvent(5, baseName, mainAssemblyName, cultureName, loadedAssemblyName, resourceFileName);
+ }
+
+ // manifest resource stream lookup failed
+ [Event(6, Level = EventLevel.Warning, Keywords = Keywords.Loader)]
+ public void ResourceManagerStreamNotFound(String baseName, String mainAssemblyName, String cultureName, String loadedAssemblyName, String resourceFileName) {
+ if (IsEnabled())
+ WriteEvent(6, baseName, mainAssemblyName, cultureName, loadedAssemblyName, resourceFileName);
+ }
+
+ [Event(7, Level = EventLevel.Informational, Keywords = Keywords.Loader)]
+ public void ResourceManagerGetSatelliteAssemblySucceeded(String baseName, String mainAssemblyName, String cultureName, String assemblyName) {
+ if (IsEnabled())
+ WriteEvent(7, baseName, mainAssemblyName, cultureName, assemblyName);
+ }
+
+ [Event(8, Level = EventLevel.Warning, Keywords = Keywords.Loader)]
+ public void ResourceManagerGetSatelliteAssemblyFailed(String baseName, String mainAssemblyName, String cultureName, String assemblyName) {
+ if (IsEnabled())
+ WriteEvent(8, baseName, mainAssemblyName, cultureName, assemblyName);
+ }
+
+ [Event(9, Level = EventLevel.Informational, Keywords = Keywords.Loader)]
+ public void ResourceManagerCaseInsensitiveResourceStreamLookupSucceeded(String baseName, String mainAssemblyName, String assemblyName, String resourceFileName) {
+ if (IsEnabled())
+ WriteEvent(9, baseName, mainAssemblyName, assemblyName, resourceFileName);
+ }
+
+ [Event(10, Level = EventLevel.Warning, Keywords = Keywords.Loader)]
+ public void ResourceManagerCaseInsensitiveResourceStreamLookupFailed(String baseName, String mainAssemblyName, String assemblyName, String resourceFileName) {
+ if (IsEnabled())
+ WriteEvent(10, baseName, mainAssemblyName, assemblyName, resourceFileName);
+ }
+
+ // Could not access the manifest resource the assembly
+ [Event(11, Level = EventLevel.Error, Keywords = Keywords.Loader)]
+ public void ResourceManagerManifestResourceAccessDenied(String baseName, String mainAssemblyName, String assemblyName, String canonicalName) {
+ if (IsEnabled())
+ WriteEvent(11, baseName, mainAssemblyName, assemblyName, canonicalName);
+ }
+
+ // Neutral resources are sufficient for this culture. Skipping satellites
+ [Event(12, Level = EventLevel.Informational, Keywords = Keywords.Loader)]
+ public void ResourceManagerNeutralResourcesSufficient(String baseName, String mainAssemblyName, String cultureName) {
+ if (IsEnabled())
+ WriteEvent(12, baseName, mainAssemblyName, cultureName);
+ }
+
+ [Event(13, Level = EventLevel.Warning, Keywords = Keywords.Loader)]
+ public void ResourceManagerNeutralResourceAttributeMissing(String mainAssemblyName) {
+ if (IsEnabled())
+ WriteEvent(13, mainAssemblyName);
+ }
+
+ [Event(14, Level = EventLevel.Informational, Keywords = Keywords.Loader)]
+ public void ResourceManagerCreatingResourceSet(String baseName, String mainAssemblyName, String cultureName, String fileName) {
+ if (IsEnabled())
+ WriteEvent(14, baseName, mainAssemblyName, cultureName, fileName);
+ }
+
+ [Event(15, Level = EventLevel.Informational, Keywords = Keywords.Loader)]
+ public void ResourceManagerNotCreatingResourceSet(String baseName, String mainAssemblyName, String cultureName) {
+ if (IsEnabled())
+ WriteEvent(15, baseName, mainAssemblyName, cultureName);
+ }
+
+ [Event(16, Level = EventLevel.Warning, Keywords = Keywords.Loader)]
+ public void ResourceManagerLookupFailed(String baseName, String mainAssemblyName, String cultureName) {
+ if (IsEnabled())
+ WriteEvent(16, baseName, mainAssemblyName, cultureName);
+ }
+
+ [Event(17, Level = EventLevel.Informational, Keywords = Keywords.Loader)]
+ public void ResourceManagerReleasingResources(String baseName, String mainAssemblyName) {
+ if (IsEnabled())
+ WriteEvent(17, baseName, mainAssemblyName);
+ }
+
+ [Event(18, Level = EventLevel.Warning, Keywords = Keywords.Loader)]
+ public void ResourceManagerNeutralResourcesNotFound(String baseName, String mainAssemblyName, String resName) {
+ if (IsEnabled())
+ WriteEvent(18, baseName, mainAssemblyName, resName);
+ }
+
+ [Event(19, Level = EventLevel.Informational, Keywords = Keywords.Loader)]
+ public void ResourceManagerNeutralResourcesFound(String baseName, String mainAssemblyName, String resName) {
+ if (IsEnabled())
+ WriteEvent(19, baseName, mainAssemblyName, resName);
+ }
+
+ [Event(20, Level = EventLevel.Informational, Keywords = Keywords.Loader)]
+ public void ResourceManagerAddingCultureFromConfigFile(String baseName, String mainAssemblyName, String cultureName) {
+ if (IsEnabled())
+ WriteEvent(20, baseName, mainAssemblyName, cultureName);
+ }
+
+ [Event(21, Level = EventLevel.Informational, Keywords = Keywords.Loader)]
+ public void ResourceManagerCultureNotFoundInConfigFile(String baseName, String mainAssemblyName, String cultureName) {
+ if (IsEnabled())
+ WriteEvent(21, baseName, mainAssemblyName, cultureName);
+ }
+
+ [Event(22, Level = EventLevel.Informational, Keywords = Keywords.Loader)]
+ public void ResourceManagerCultureFoundInConfigFile(String baseName, String mainAssemblyName, String cultureName) {
+ if (IsEnabled())
+ WriteEvent(22, baseName, mainAssemblyName, cultureName);
+ }
+
+
+ // ResourceManager Event Wrappers
+
+ [NonEvent]
+ public void ResourceManagerLookupStarted(String baseName, Assembly mainAssembly, String cultureName) {
+ if (IsEnabled())
+ ResourceManagerLookupStarted(baseName, GetName(mainAssembly), cultureName);
+ }
+
+ [NonEvent]
+ public void ResourceManagerLookingForResourceSet(String baseName, Assembly mainAssembly, String cultureName) {
+ if (IsEnabled())
+ ResourceManagerLookingForResourceSet(baseName, GetName(mainAssembly), cultureName);
+ }
+
+ [NonEvent]
+ public void ResourceManagerFoundResourceSetInCache(String baseName, Assembly mainAssembly, String cultureName) {
+ if (IsEnabled())
+ ResourceManagerFoundResourceSetInCache(baseName, GetName(mainAssembly), cultureName);
+ }
+
+ [NonEvent]
+ public void ResourceManagerFoundResourceSetInCacheUnexpected(String baseName, Assembly mainAssembly, String cultureName) {
+ if (IsEnabled())
+ ResourceManagerFoundResourceSetInCacheUnexpected(baseName, GetName(mainAssembly), cultureName);
+ }
+
+ [NonEvent]
+ public void ResourceManagerStreamFound(String baseName, Assembly mainAssembly, String cultureName, Assembly loadedAssembly, String resourceFileName) {
+ if (IsEnabled())
+ ResourceManagerStreamFound(baseName, GetName(mainAssembly), cultureName, GetName(loadedAssembly), resourceFileName);
+ }
+
+ [NonEvent]
+ public void ResourceManagerStreamNotFound(String baseName, Assembly mainAssembly, String cultureName, Assembly loadedAssembly, String resourceFileName) {
+ if (IsEnabled())
+ ResourceManagerStreamNotFound(baseName, GetName(mainAssembly), cultureName, GetName(loadedAssembly), resourceFileName);
+ }
+
+ [NonEvent]
+ public void ResourceManagerGetSatelliteAssemblySucceeded(String baseName, Assembly mainAssembly, String cultureName, String assemblyName) {
+ if (IsEnabled())
+ ResourceManagerGetSatelliteAssemblySucceeded(baseName, GetName(mainAssembly), cultureName, assemblyName);
+ }
+
+ [NonEvent]
+ public void ResourceManagerGetSatelliteAssemblyFailed(String baseName, Assembly mainAssembly, String cultureName, String assemblyName) {
+ if (IsEnabled())
+ ResourceManagerGetSatelliteAssemblyFailed(baseName, GetName(mainAssembly), cultureName, assemblyName);
+ }
+
+ [NonEvent]
+ public void ResourceManagerCaseInsensitiveResourceStreamLookupSucceeded(String baseName, Assembly mainAssembly, String assemblyName, String resourceFileName) {
+ if (IsEnabled())
+ ResourceManagerCaseInsensitiveResourceStreamLookupSucceeded(baseName, GetName(mainAssembly), assemblyName, resourceFileName);
+ }
+
+ [NonEvent]
+ public void ResourceManagerCaseInsensitiveResourceStreamLookupFailed(String baseName, Assembly mainAssembly, String assemblyName, String resourceFileName) {
+ if (IsEnabled())
+ ResourceManagerCaseInsensitiveResourceStreamLookupFailed(baseName, GetName(mainAssembly), assemblyName, resourceFileName);
+ }
+
+ [NonEvent]
+ public void ResourceManagerManifestResourceAccessDenied(String baseName, Assembly mainAssembly, String assemblyName, String canonicalName) {
+ if (IsEnabled())
+ ResourceManagerManifestResourceAccessDenied(baseName, GetName(mainAssembly), assemblyName, canonicalName);
+ }
+
+ [NonEvent]
+ public void ResourceManagerNeutralResourcesSufficient(String baseName, Assembly mainAssembly, String cultureName) {
+ if (IsEnabled())
+ ResourceManagerNeutralResourcesSufficient(baseName, GetName(mainAssembly), cultureName);
+ }
+
+ [NonEvent]
+ public void ResourceManagerNeutralResourceAttributeMissing(Assembly mainAssembly) {
+ if (IsEnabled())
+ ResourceManagerNeutralResourceAttributeMissing(GetName(mainAssembly));
+ }
+
+ [NonEvent]
+ public void ResourceManagerCreatingResourceSet(String baseName, Assembly mainAssembly, String cultureName, String fileName) {
+ if (IsEnabled())
+ ResourceManagerCreatingResourceSet(baseName, GetName(mainAssembly), cultureName, fileName);
+ }
+
+ [NonEvent]
+ public void ResourceManagerNotCreatingResourceSet(String baseName, Assembly mainAssembly, String cultureName) {
+ if (IsEnabled())
+ ResourceManagerNotCreatingResourceSet(baseName, GetName(mainAssembly), cultureName);
+ }
+
+ [NonEvent]
+ public void ResourceManagerLookupFailed(String baseName, Assembly mainAssembly, String cultureName) {
+ if (IsEnabled())
+ ResourceManagerLookupFailed(baseName, GetName(mainAssembly), cultureName);
+ }
+
+ [NonEvent]
+ public void ResourceManagerReleasingResources(String baseName, Assembly mainAssembly) {
+ if (IsEnabled())
+ ResourceManagerReleasingResources(baseName, GetName(mainAssembly));
+ }
+
+ [NonEvent]
+ public void ResourceManagerNeutralResourcesNotFound(String baseName, Assembly mainAssembly, String resName) {
+ if (IsEnabled())
+ ResourceManagerNeutralResourcesNotFound(baseName, GetName(mainAssembly), resName);
+ }
+
+ [NonEvent]
+ public void ResourceManagerNeutralResourcesFound(String baseName, Assembly mainAssembly, String resName) {
+ if (IsEnabled())
+ ResourceManagerNeutralResourcesFound(baseName, GetName(mainAssembly), resName);
+ }
+
+ [NonEvent]
+ public void ResourceManagerAddingCultureFromConfigFile(String baseName, Assembly mainAssembly, String cultureName) {
+ if (IsEnabled())
+ ResourceManagerAddingCultureFromConfigFile(baseName, GetName(mainAssembly), cultureName);
+ }
+
+ [NonEvent]
+ public void ResourceManagerCultureNotFoundInConfigFile(String baseName, Assembly mainAssembly, String cultureName) {
+ if (IsEnabled())
+ ResourceManagerCultureNotFoundInConfigFile(baseName, GetName(mainAssembly), cultureName);
+ }
+
+ [NonEvent]
+ public void ResourceManagerCultureFoundInConfigFile(String baseName, Assembly mainAssembly, String cultureName) {
+ if (IsEnabled())
+ ResourceManagerCultureFoundInConfigFile(baseName, GetName(mainAssembly), cultureName);
+ }
+
+ private static string GetName(Assembly assembly) {
+ if (assembly == null)
+ return "<<NULL>>";
+ else
+ return assembly.FullName;
+ }
+
+ [Event(30, Level = EventLevel.Verbose, Keywords = Keywords.ThreadPool|Keywords.ThreadTransfer)]
+ public void ThreadPoolEnqueueWork(long workID) {
+ WriteEvent(30, workID);
+ }
+ [NonEvent, System.Security.SecuritySafeCritical]
+ public unsafe void ThreadPoolEnqueueWorkObject(object workID) {
+ // convert the Object Id to a long
+ ThreadPoolEnqueueWork((long) *((void**) JitHelpers.UnsafeCastToStackPointer(ref workID)));
+ }
+
+ [Event(31, Level = EventLevel.Verbose, Keywords = Keywords.ThreadPool|Keywords.ThreadTransfer)]
+ public void ThreadPoolDequeueWork(long workID) {
+ WriteEvent(31, workID);
+ }
+
+ [NonEvent, System.Security.SecuritySafeCritical]
+ public unsafe void ThreadPoolDequeueWorkObject(object workID) {
+ // convert the Object Id to a long
+ ThreadPoolDequeueWork((long) *((void**) JitHelpers.UnsafeCastToStackPointer(ref workID)));
+ }
+
+ // In the desktop runtime they don't use Tasks for the point at which the response happens, which means that the
+ // Activity ID created by start using implicit activity IDs does not match. Thus disable implicit activities (until we fix that)
+ [Event(140, Level = EventLevel.Informational, Keywords = Keywords.NetClient, ActivityOptions=EventActivityOptions.Disable,
+ Task = Tasks.GetResponse, Opcode = EventOpcode.Start, Version = 1)]
+ private void GetResponseStart(long id, string uri, bool success, bool synchronous) {
+ WriteEvent(140, id, uri, success, synchronous);
+ }
+
+ [Event(141, Level = EventLevel.Informational, Keywords = Keywords.NetClient, ActivityOptions=EventActivityOptions.Disable,
+ Task = Tasks.GetResponse, Opcode = EventOpcode.Stop, Version = 1)]
+ private void GetResponseStop(long id, bool success, bool synchronous, int statusCode) {
+ WriteEvent(141, id, success, synchronous, statusCode);
+ }
+
+ // In the desktop runtime they don't use Tasks for the point at which the response happens, which means that the
+ // Activity ID created by start using implicit activity IDs does not match. Thus disable implicit activities (until we fix that)
+ [Event(142, Level = EventLevel.Informational, Keywords = Keywords.NetClient, ActivityOptions=EventActivityOptions.Disable,
+ Task = Tasks.GetRequestStream, Opcode = EventOpcode.Start, Version = 1)]
+ private void GetRequestStreamStart(long id, string uri, bool success, bool synchronous) {
+ WriteEvent(142, id, uri, success, synchronous);
+ }
+
+ [Event(143, Level = EventLevel.Informational, Keywords = Keywords.NetClient, ActivityOptions=EventActivityOptions.Disable,
+ Task = Tasks.GetRequestStream, Opcode = EventOpcode.Stop, Version = 1)]
+ private void GetRequestStreamStop(long id, bool success, bool synchronous) {
+ WriteEvent(143, id, success, synchronous);
+ }
+
+ [NonEvent, System.Security.SecuritySafeCritical]
+ public unsafe void BeginGetResponse(object id, string uri, bool success, bool synchronous) {
+ if (IsEnabled())
+ GetResponseStart(IdForObject(id), uri, success, synchronous);
+ }
+
+ [NonEvent, System.Security.SecuritySafeCritical]
+ public unsafe void EndGetResponse(object id, bool success, bool synchronous, int statusCode) {
+ if (IsEnabled())
+ GetResponseStop(IdForObject(id), success, synchronous, statusCode);
+ }
+
+ [NonEvent, System.Security.SecuritySafeCritical]
+ public unsafe void BeginGetRequestStream(object id, string uri, bool success, bool synchronous) {
+ if (IsEnabled())
+ GetRequestStreamStart(IdForObject(id), uri, success, synchronous);
+ }
+
+ [NonEvent, System.Security.SecuritySafeCritical]
+ public unsafe void EndGetRequestStream(object id, bool success, bool synchronous) {
+ if (IsEnabled())
+ GetRequestStreamStop(IdForObject(id), success, synchronous);
+ }
+
+ // id - represents a correlation ID that allows correlation of two activities, one stamped by
+ // ThreadTransferSend, the other by ThreadTransferReceive
+ // kind - identifies the transfer: values below 64 are reserved for the runtime. Currently used values:
+ // 1 - managed Timers ("roaming" ID)
+ // 2 - managed async IO operations (FileStream, PipeStream, a.o.)
+ // 3 - WinRT dispatch operations
+ // info - any additional information user code might consider interesting
+ [Event(150, Level = EventLevel.Informational, Keywords = Keywords.ThreadTransfer, Task = Tasks.ThreadTransfer, Opcode = EventOpcode.Send)]
+ public void ThreadTransferSend(long id, int kind, string info, bool multiDequeues) {
+ if (IsEnabled())
+ WriteEvent(150, id, kind, info, multiDequeues);
+ }
+ // id - is a managed object. it gets translated to the object's address. ETW listeners must
+ // keep track of GC movements in order to correlate the value passed to XyzSend with the
+ // (possibly changed) value passed to XyzReceive
+ [NonEvent, System.Security.SecuritySafeCritical]
+ public unsafe void ThreadTransferSendObj(object id, int kind, string info, bool multiDequeues) {
+ ThreadTransferSend((long) *((void**) JitHelpers.UnsafeCastToStackPointer(ref id)), kind, info, multiDequeues);
+ }
+
+ // id - represents a correlation ID that allows correlation of two activities, one stamped by
+ // ThreadTransferSend, the other by ThreadTransferReceive
+ // kind - identifies the transfer: values below 64 are reserved for the runtime. Currently used values:
+ // 1 - managed Timers ("roaming" ID)
+ // 2 - managed async IO operations (FileStream, PipeStream, a.o.)
+ // 3 - WinRT dispatch operations
+ // info - any additional information user code might consider interesting
+ [Event(151, Level = EventLevel.Informational, Keywords = Keywords.ThreadTransfer, Task = Tasks.ThreadTransfer, Opcode = EventOpcode.Receive)]
+ public void ThreadTransferReceive(long id, int kind, string info) {
+ if (IsEnabled())
+ WriteEvent(151, id, kind, info);
+ }
+ // id - is a managed object. it gets translated to the object's address. ETW listeners must
+ // keep track of GC movements in order to correlate the value passed to XyzSend with the
+ // (possibly changed) value passed to XyzReceive
+ [NonEvent, System.Security.SecuritySafeCritical]
+ public unsafe void ThreadTransferReceiveObj(object id, int kind, string info) {
+ ThreadTransferReceive((long) *((void**) JitHelpers.UnsafeCastToStackPointer(ref id)), kind, info);
+ }
+
+ // id - represents a correlation ID that allows correlation of two activities, one stamped by
+ // ThreadTransferSend, the other by ThreadTransferReceive
+ // kind - identifies the transfer: values below 64 are reserved for the runtime. Currently used values:
+ // 1 - managed Timers ("roaming" ID)
+ // 2 - managed async IO operations (FileStream, PipeStream, a.o.)
+ // 3 - WinRT dispatch operations
+ // info - any additional information user code might consider interesting
+ [Event(152, Level = EventLevel.Informational, Keywords = Keywords.ThreadTransfer, Task = Tasks.ThreadTransfer, Opcode = Opcodes.ReceiveHandled)]
+ public void ThreadTransferReceiveHandled(long id, int kind, string info) {
+ if (IsEnabled())
+ WriteEvent(152, id, kind, info);
+ }
+ // id - is a managed object. it gets translated to the object's address. ETW listeners must
+ // keep track of GC movements in order to correlate the value passed to XyzSend with the
+ // (possibly changed) value passed to XyzReceive
+ [NonEvent, System.Security.SecuritySafeCritical]
+ public unsafe void ThreadTransferReceiveHandledObj(object id, int kind, string info) {
+ ThreadTransferReceive((long) *((void**) JitHelpers.UnsafeCastToStackPointer(ref id)), kind, info);
+ }
+
+ // return a stable ID for a an object. We use the hash code which is not truely unique but is
+ // close enough for now at least. we add to it 0x7FFFFFFF00000000 to make it distinguishable
+ // from the style of ID that simply casts the object reference to a long (since old versions of the
+ // runtime will emit IDs of that form).
+ private static long IdForObject(object obj) {
+ return obj.GetHashCode() + 0x7FFFFFFF00000000;
+ }
+ }
+}
+