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 using System.Collections.Concurrent;
5 using System.Runtime.CompilerServices;
6 using System.Runtime.InteropServices;
10 namespace System.Diagnostics.Tracing
12 internal sealed class EventPipeEventProvider : IEventProvider
14 // The EventPipeProvider handle.
15 private IntPtr m_provHandle = IntPtr.Zero;
17 // Register an event provider.
18 unsafe uint IEventProvider.EventRegister(
20 UnsafeNativeMethods.ManifestEtw.EtwEnableCallback enableCallback,
21 void* callbackContext,
22 ref long registrationHandle)
24 uint returnStatus = 0;
25 m_provHandle = EventPipeInternal.CreateProvider(providerId, enableCallback);
26 if(m_provHandle != IntPtr.Zero)
28 // Fixed registration handle because a new EventPipeEventProvider
29 // will be created for each new EventSource.
30 registrationHandle = 1;
34 // Unable to create the provider.
41 // Unregister an event provider.
42 uint IEventProvider.EventUnregister(long registrationHandle)
44 EventPipeInternal.DeleteProvider(m_provHandle);
49 unsafe int IEventProvider.EventWriteTransferWrapper(
50 long registrationHandle,
51 ref EventDescriptor eventDescriptor,
53 Guid* relatedActivityId,
55 EventProvider.EventData* userData)
60 // Get or set the per-thread activity ID.
61 int IEventProvider.EventActivityIdControl(UnsafeNativeMethods.ManifestEtw.ActivityControl ControlCode, ref Guid ActivityId)
67 // PInvokes into the runtime used to interact with the EventPipe.
68 internal static class EventPipeInternal
70 [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
71 [SuppressUnmanagedCodeSecurity]
72 internal static extern IntPtr CreateProvider(Guid providerID, UnsafeNativeMethods.ManifestEtw.EtwEnableCallback callbackFunc);
74 [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
75 [SuppressUnmanagedCodeSecurity]
76 internal static extern IntPtr AddEvent(IntPtr provHandle, Int64 keywords, uint eventID, uint eventVersion, uint level, bool needStack);
78 [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
79 [SuppressUnmanagedCodeSecurity]
80 internal static extern void DeleteProvider(IntPtr provHandle);
82 [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
83 [SuppressUnmanagedCodeSecurity]
84 internal static extern unsafe void WriteEvent(IntPtr eventHandle, void* data, uint length);