Use function pointers instead of marshalled delegates in EventSource (#79970)
authorJan Kotas <jkotas@microsoft.com>
Fri, 6 Jan 2023 00:06:05 +0000 (16:06 -0800)
committerGitHub <noreply@github.com>
Fri, 6 Jan 2023 00:06:05 +0000 (16:06 -0800)
* Delete obsolete security kernel annotations

* Use function pointers instead of marshalled delegates in EventSource

32 files changed:
src/coreclr/System.Private.CoreLib/src/System/Diagnostics/Eventing/EventPipe.CoreCLR.cs
src/coreclr/scripts/genEventPipe.py
src/coreclr/vm/eventpipeadapter.h
src/coreclr/vm/eventpipeinternal.cpp
src/coreclr/vm/eventpipeinternal.h
src/libraries/Common/src/Interop/Windows/Advapi32/Interop.EtwEnableCallback.cs
src/libraries/Common/src/Interop/Windows/Advapi32/Interop.EventRegister.cs
src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/EventPipeEventProvider.cs
src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/EventProvider.cs
src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/IEventProvider.cs
src/mono/System.Private.CoreLib/src/System/Diagnostics/Tracing/EventPipe.Mono.cs
src/mono/mono/component/event_pipe-stub.c
src/mono/mono/component/event_pipe.h
src/mono/mono/eventpipe/test/ep-buffer-manager-tests.c
src/mono/mono/eventpipe/test/ep-buffer-tests.c
src/mono/mono/eventpipe/test/ep-fastserializer-tests.c
src/mono/mono/eventpipe/test/ep-file-tests.c
src/mono/mono/eventpipe/test/ep-tests.c
src/mono/mono/metadata/icall-def.h
src/mono/mono/metadata/icall-eventpipe.c
src/native/eventpipe/ep-config-internals.h
src/native/eventpipe/ep-config.c
src/native/eventpipe/ep-config.h
src/native/eventpipe/ep-event-source.c
src/native/eventpipe/ep-provider-internals.h
src/native/eventpipe/ep-provider.c
src/native/eventpipe/ep-provider.h
src/native/eventpipe/ep-sample-profiler.c
src/native/eventpipe/ep-types-forward.h
src/native/eventpipe/ep.c
src/native/eventpipe/ep.h
src/tasks/WasmAppBuilder/PInvokeTableGenerator.cs

index 20682ec..db76c99 100644 (file)
@@ -29,7 +29,9 @@ namespace System.Diagnostics.Tracing
         // These PInvokes are used by EventSource to interact with the EventPipe.
         //
         [LibraryImport(RuntimeHelpers.QCall, EntryPoint = "EventPipeInternal_CreateProvider", StringMarshalling = StringMarshalling.Utf16)]
-        internal static partial IntPtr CreateProvider(string providerName, Interop.Advapi32.EtwEnableCallback callbackFunc);
+        internal static unsafe partial IntPtr CreateProvider(string providerName,
+            delegate* unmanaged<byte*, int, byte, long, long, Interop.Advapi32.EVENT_FILTER_DESCRIPTOR*, void*, void> callbackFunc,
+            void* callbackContext);
 
         [LibraryImport(RuntimeHelpers.QCall, EntryPoint = "EventPipeInternal_DefineEvent")]
         internal static unsafe partial IntPtr DefineEvent(IntPtr provHandle, uint eventID, long keywords, uint eventVersion, uint level, void *pMetadata, uint metadataLength);
index 3d2d179..51f36d3 100644 (file)
@@ -1035,7 +1035,7 @@ create_provider (
 
     ep_return_null_if_nok (provider_name_utf8 != NULL);
 
-    EventPipeProvider *provider = ep_create_provider (provider_name_utf8, callback_func, NULL, NULL);
+    EventPipeProvider *provider = ep_create_provider (provider_name_utf8, callback_func, NULL);
 
     g_free (provider_name_utf8);
     return provider;
index d324e20..97ee4fd 100644 (file)
@@ -318,7 +318,7 @@ public:
                ep_add_provider_to_session (provider, session);
        }
 
-       static inline EventPipeProvider * CreateProvider(const SString &providerName, EventPipeCallback callback)
+       static inline EventPipeProvider * CreateProvider(const SString &providerName, EventPipeCallback callback, void* callbackContext = nullptr)
        {
                CONTRACTL
                {
@@ -329,7 +329,7 @@ public:
                CONTRACTL_END;
 
                ep_char8_t *providerNameUTF8 = ep_rt_utf16_to_utf8_string(reinterpret_cast<const ep_char16_t *>(providerName.GetUnicode ()), -1);
-               EventPipeProvider * provider = ep_create_provider (providerNameUTF8, callback, NULL, NULL);
+               EventPipeProvider * provider = ep_create_provider (providerNameUTF8, callback, callbackContext);
                ep_rt_utf8_string_free (providerNameUTF8);
                return provider;
        }
index 4ed2b81..57cf10f 100644 (file)
@@ -85,7 +85,8 @@ extern "C" BOOL QCALLTYPE EventPipeInternal_GetSessionInfo(UINT64 sessionID, Eve
 
 extern "C" INT_PTR QCALLTYPE EventPipeInternal_CreateProvider(
     _In_z_ LPCWSTR providerName,
-    EventPipeCallback pCallbackFunc)
+    EventPipeCallback pCallbackFunc,
+    void* pCallbackContext)
 {
     QCALL_CONTRACT;
 
@@ -93,7 +94,7 @@ extern "C" INT_PTR QCALLTYPE EventPipeInternal_CreateProvider(
 
     BEGIN_QCALL;
 
-    pProvider = EventPipeAdapter::CreateProvider(providerName, pCallbackFunc);
+    pProvider = EventPipeAdapter::CreateProvider(providerName, pCallbackFunc, pCallbackContext);
 
     END_QCALL;
 
index b18bfe9..1ecbb79 100644 (file)
@@ -55,7 +55,8 @@ extern "C" BOOL QCALLTYPE EventPipeInternal_GetSessionInfo(UINT64 sessionID, Eve
 
 extern "C" INT_PTR QCALLTYPE EventPipeInternal_CreateProvider(
     _In_z_ LPCWSTR providerName,
-    EventPipeCallback pCallbackFunc);
+    EventPipeCallback pCallbackFunc,
+    void* pCallbackContext);
 
 extern "C" INT_PTR QCALLTYPE EventPipeInternal_DefineEvent(
     INT_PTR provHandle,
index 8d14092..742d45d 100644 (file)
@@ -19,14 +19,5 @@ internal static partial class Interop
             public int Size;
             public int Type;
         }
-
-        internal unsafe delegate void EtwEnableCallback(
-            Guid* sourceId,
-            int isEnabled,
-            byte level,
-            long matchAnyKeywords,
-            long matchAllKeywords,
-            EVENT_FILTER_DESCRIPTOR* filterData,
-            void* callbackContext);
     }
 }
index c108200..3eabb46 100644 (file)
@@ -10,9 +10,9 @@ internal static partial class Interop
     {
         [LibraryImport(Libraries.Advapi32)]
         internal static unsafe partial uint EventRegister(
-            in Guid providerId,
-            EtwEnableCallback enableCallback,
+            Guid* providerId,
+            delegate* unmanaged<Guid*, int, byte, long, long, EVENT_FILTER_DESCRIPTOR*, void*, void> enableCallback,
             void* callbackContext,
-            ref long registrationHandle);
+            long* registrationHandle);
     }
 }
index e843cb3..2780b5f 100644 (file)
@@ -1,47 +1,59 @@
 // Licensed to the .NET Foundation under one or more agreements.
 // The .NET Foundation licenses this file to you under the MIT license.
 
+using System.Runtime.InteropServices;
+
 namespace System.Diagnostics.Tracing
 {
     internal sealed class EventPipeEventProvider : IEventProvider
     {
-        // The EventPipeProvider handle.
-        private IntPtr m_provHandle = IntPtr.Zero;
+        private EventEnableCallback? _enableCallback;
+        private IntPtr _provHandle;
+        private GCHandle _gcHandle;
+
+        [UnmanagedCallersOnly]
+        private static unsafe void Callback(byte* sourceId, int isEnabled, byte level,
+            long matchAnyKeywords, long matchAllKeywords, Interop.Advapi32.EVENT_FILTER_DESCRIPTOR* filterData, void* callbackContext)
+        {
+            ((EventPipeEventProvider)GCHandle.FromIntPtr((IntPtr)callbackContext).Target!)._enableCallback!(
+                isEnabled, level, matchAnyKeywords, matchAllKeywords, filterData);
+        }
 
         // Register an event provider.
-        unsafe uint IEventProvider.EventRegister(
+        unsafe void IEventProvider.EventRegister(
             EventSource eventSource,
-            Interop.Advapi32.EtwEnableCallback enableCallback,
-            void* callbackContext,
-            ref long registrationHandle)
+            EventEnableCallback enableCallback)
         {
-            uint returnStatus = 0;
-            m_provHandle = EventPipeInternal.CreateProvider(eventSource.Name, enableCallback);
-            if (m_provHandle != IntPtr.Zero)
-            {
-                // Fixed registration handle because a new EventPipeEventProvider
-                // will be created for each new EventSource.
-                registrationHandle = 1;
-            }
-            else
+            _enableCallback = enableCallback;
+
+            Debug.Assert(!_gcHandle.IsAllocated);
+            _gcHandle = GCHandle.Alloc(this);
+
+            _provHandle = EventPipeInternal.CreateProvider(eventSource.Name, &Callback, (void*)GCHandle.ToIntPtr(_gcHandle));
+            if (_provHandle == 0)
             {
                 // Unable to create the provider.
-                returnStatus = 1;
+                _gcHandle.Free();
+                throw new OutOfMemoryException();
             }
-
-            return returnStatus;
         }
 
         // Unregister an event provider.
-        uint IEventProvider.EventUnregister(long registrationHandle)
+        void IEventProvider.EventUnregister()
         {
-            EventPipeInternal.DeleteProvider(m_provHandle);
-            return 0;
+            if (_provHandle != 0)
+            {
+                EventPipeInternal.DeleteProvider(_provHandle);
+                _provHandle = 0;
+            }
+            if (_gcHandle.IsAllocated)
+            {
+                _gcHandle.Free();
+            }
         }
 
         // Write an event.
         unsafe EventProvider.WriteEventErrorCode IEventProvider.EventWriteTransfer(
-            long registrationHandle,
             in EventDescriptor eventDescriptor,
             IntPtr eventHandle,
             Guid* activityId,
@@ -82,8 +94,7 @@ namespace System.Diagnostics.Tracing
         unsafe IntPtr IEventProvider.DefineEventHandle(uint eventID, string eventName, long keywords, uint eventVersion, uint level,
             byte *pMetadata, uint metadataLength)
         {
-            IntPtr eventHandlePtr = EventPipeInternal.DefineEvent(m_provHandle, eventID, keywords, eventVersion, level, pMetadata, metadataLength);
-            return eventHandlePtr;
+            return EventPipeInternal.DefineEvent(_provHandle, eventID, keywords, eventVersion, level, pMetadata, metadataLength);
         }
 
         // Get or set the per-thread activity ID.
index 0262cd8..b9c2ff1 100644 (file)
@@ -32,6 +32,13 @@ namespace System.Diagnostics.Tracing
         Disable = -3,
     }
 
+    internal unsafe delegate void EventEnableCallback(
+        int isEnabled,
+        byte level,
+        long matchAnyKeywords,
+        long matchAllKeywords,
+        Interop.Advapi32.EVENT_FILTER_DESCRIPTOR* filterData);
+
     /// <summary>
     /// Only here because System.Diagnostics.EventProvider needs one more extensibility hook (when it gets a
     /// controller callback)
@@ -66,8 +73,6 @@ namespace System.Diagnostics.Tracing
         }
 
         internal IEventProvider m_eventProvider;         // The interface that implements the specific logging mechanism functions.
-        private Interop.Advapi32.EtwEnableCallback? m_etwCallback;     // Trace Callback function
-        private long m_regHandle;                        // Trace Registration Handle
         private byte m_level;                            // Tracing Level
         private long m_anyKeywordMask;                   // Trace Enable Flags
         private long m_allKeywordMask;                   // Match all keyword
@@ -122,25 +127,12 @@ namespace System.Diagnostics.Tracing
         /// Vista or above. If not a PlatformNotSupported exception will be thrown. If for some
         /// reason the ETW Register call failed a NotSupported exception will be thrown.
         /// </summary>
-        // <SecurityKernel Critical="True" Ring="0">
-        // <CallsSuppressUnmanagedCode Name="Interop.Advapi32.EventRegister(System.Guid*,Microsoft.Win32.Interop.Advapi32+EtwEnableCallback,System.Void*,System.Int64&):System.UInt32" />
-        // <SatisfiesLinkDemand Name="Win32Exception..ctor(System.Int32)" />
-        // <ReferencesCritical Name="Method: EtwEnableCallBack(Guid*, Int32, Byte, Int64, Int64, Void*, Void*):Void" Ring="1" />
-        // </SecurityKernel>
         internal unsafe void Register(EventSource eventSource)
         {
-            uint status;
-            m_etwCallback = new Interop.Advapi32.EtwEnableCallback(EtwEnableCallBack);
+            m_providerName = eventSource.Name;
+            m_providerId = eventSource.Guid;
 
-            status = EventRegister(eventSource, m_etwCallback);
-            if (status != 0)
-            {
-#if TARGET_WINDOWS
-                throw new ArgumentException(Interop.Kernel32.GetMessage(unchecked((int)status)));
-#else
-                throw new ArgumentException(Convert.ToString(unchecked((int)status)));
-#endif
-            }
+            m_eventProvider.EventRegister(eventSource, new EventEnableCallback(EnableCallBack));
         }
 
         //
@@ -155,9 +147,6 @@ namespace System.Diagnostics.Tracing
             GC.SuppressFinalize(this);
         }
 
-        // <SecurityKernel Critical="True" TreatAsSafe="Does not expose critical resource" Ring="1">
-        // <ReferencesCritical Name="Method: Deregister():Void" Ring="1" />
-        // </SecurityKernel>
         protected virtual void Dispose(bool disposing)
         {
             //
@@ -178,15 +167,12 @@ namespace System.Diagnostics.Tracing
 
             // Do most of the work under a lock to avoid shutdown race.
 
-            long registrationHandle = 0;
             lock (EventListener.EventListenersLock)
             {
                 // Double check
                 if (m_disposed)
                     return;
 
-                registrationHandle = m_regHandle;
-                m_regHandle = 0;
                 m_disposed = true;
             }
 
@@ -199,8 +185,7 @@ namespace System.Diagnostics.Tracing
             //
             // We solve by Unregistering after releasing the EventListenerLock.
             Debug.Assert(!Monitor.IsEntered(EventListener.EventListenersLock));
-            if (registrationHandle != 0)
-                EventUnregister(registrationHandle);
+            m_eventProvider.EventUnregister();
         }
 
         /// <summary>
@@ -217,19 +202,12 @@ namespace System.Diagnostics.Tracing
             Dispose(false);
         }
 
-        // <SecurityKernel Critical="True" Ring="0">
-        // <UsesUnsafeCode Name="Parameter filterData of type: Void*" />
-        // <UsesUnsafeCode Name="Parameter callbackContext of type: Void*" />
-        // </SecurityKernel>
-        private unsafe void EtwEnableCallBack(
-                        System.Guid* sourceId,
+        private unsafe void EnableCallBack(
                         int controlCode,
                         byte setLevel,
                         long anyKeyword,
                         long allKeyword,
-                        Interop.Advapi32.EVENT_FILTER_DESCRIPTOR* filterData,
-                        void* callbackContext
-                        )
+                        Interop.Advapi32.EVENT_FILTER_DESCRIPTOR* filterData)
         {
             // This is an optional callback API. We will therefore ignore any failures that happen as a
             // result of turning on this provider as to not crash the app.
@@ -642,26 +620,6 @@ namespace System.Diagnostics.Tracing
             s_returnCode = error;
         }
 
-        // <SecurityKernel Critical="True" Ring="0">
-        // <UsesUnsafeCode Name="Local intptrPtr of type: IntPtr*" />
-        // <UsesUnsafeCode Name="Local intptrPtr of type: Int32*" />
-        // <UsesUnsafeCode Name="Local longptr of type: Int64*" />
-        // <UsesUnsafeCode Name="Local uintptr of type: UInt32*" />
-        // <UsesUnsafeCode Name="Local ulongptr of type: UInt64*" />
-        // <UsesUnsafeCode Name="Local charptr of type: Char*" />
-        // <UsesUnsafeCode Name="Local byteptr of type: Byte*" />
-        // <UsesUnsafeCode Name="Local shortptr of type: Int16*" />
-        // <UsesUnsafeCode Name="Local sbyteptr of type: SByte*" />
-        // <UsesUnsafeCode Name="Local ushortptr of type: UInt16*" />
-        // <UsesUnsafeCode Name="Local floatptr of type: Single*" />
-        // <UsesUnsafeCode Name="Local doubleptr of type: Double*" />
-        // <UsesUnsafeCode Name="Local boolptr of type: Boolean*" />
-        // <UsesUnsafeCode Name="Local guidptr of type: Guid*" />
-        // <UsesUnsafeCode Name="Local decimalptr of type: Decimal*" />
-        // <UsesUnsafeCode Name="Local booleanptr of type: Boolean*" />
-        // <UsesUnsafeCode Name="Parameter dataDescriptor of type: EventData*" />
-        // <UsesUnsafeCode Name="Parameter dataBuffer of type: Byte*" />
-        // </SecurityKernel>
         private static unsafe object? EncodeObject(ref object? data, ref EventData* dataDescriptor, ref byte* dataBuffer, ref uint totalEventSize)
         /*++
 
@@ -887,23 +845,6 @@ namespace System.Diagnostics.Tracing
         /// <param name="eventPayload">
         /// Payload for the ETW event.
         /// </param>
-        // <SecurityKernel Critical="True" Ring="0">
-        // <CallsSuppressUnmanagedCode Name="Interop.Advapi32.EventWrite(System.Int64,EventDescriptor&,System.UInt32,System.Void*):System.UInt32" />
-        // <UsesUnsafeCode Name="Local dataBuffer of type: Byte*" />
-        // <UsesUnsafeCode Name="Local pdata of type: Char*" />
-        // <UsesUnsafeCode Name="Local userData of type: EventData*" />
-        // <UsesUnsafeCode Name="Local userDataPtr of type: EventData*" />
-        // <UsesUnsafeCode Name="Local currentBuffer of type: Byte*" />
-        // <UsesUnsafeCode Name="Local v0 of type: Char*" />
-        // <UsesUnsafeCode Name="Local v1 of type: Char*" />
-        // <UsesUnsafeCode Name="Local v2 of type: Char*" />
-        // <UsesUnsafeCode Name="Local v3 of type: Char*" />
-        // <UsesUnsafeCode Name="Local v4 of type: Char*" />
-        // <UsesUnsafeCode Name="Local v5 of type: Char*" />
-        // <UsesUnsafeCode Name="Local v6 of type: Char*" />
-        // <UsesUnsafeCode Name="Local v7 of type: Char*" />
-        // <ReferencesCritical Name="Method: EncodeObject(Object&, EventData*, Byte*):String" Ring="1" />
-        // </SecurityKernel>
         internal unsafe bool WriteEvent(ref EventDescriptor eventDescriptor, IntPtr eventHandle, Guid* activityID, Guid* childActivityID, object?[] eventPayload)
         {
             WriteEventErrorCode status = WriteEventErrorCode.NoError;
@@ -1048,7 +989,7 @@ namespace System.Diagnostics.Tracing
                             userDataPtr[refObjPosition[7]].Ptr = (ulong)v7;
                         }
 
-                        status = m_eventProvider.EventWriteTransfer(m_regHandle, in eventDescriptor, eventHandle, activityID, childActivityID, argCount, userData);
+                        status = m_eventProvider.EventWriteTransfer(in eventDescriptor, eventHandle, activityID, childActivityID, argCount, userData);
                     }
                 }
                 else
@@ -1074,7 +1015,7 @@ namespace System.Diagnostics.Tracing
                         }
                     }
 
-                    status = m_eventProvider.EventWriteTransfer(m_regHandle, in eventDescriptor, eventHandle, activityID, childActivityID, argCount, userData);
+                    status = m_eventProvider.EventWriteTransfer(in eventDescriptor, eventHandle, activityID, childActivityID, argCount, userData);
 
                     for (int i = 0; i < refObjIndex; ++i)
                     {
@@ -1129,9 +1070,6 @@ namespace System.Diagnostics.Tracing
         /// <param name="data">
         /// pointer  do the event data
         /// </param>
-        // <SecurityKernel Critical="True" Ring="0">
-        // <CallsSuppressUnmanagedCode Name="Interop.Advapi32.EventWrite(System.Int64,EventDescriptor&,System.UInt32,System.Void*):System.UInt32" />
-        // </SecurityKernel>
         protected internal unsafe bool WriteEvent(ref EventDescriptor eventDescriptor, IntPtr eventHandle, Guid* activityID, Guid* childActivityID, int dataCount, IntPtr data)
         {
             if (childActivityID != null)
@@ -1143,7 +1081,7 @@ namespace System.Diagnostics.Tracing
                                 (EventOpcode)eventDescriptor.Opcode == EventOpcode.Stop);
             }
 
-            WriteEventErrorCode status = m_eventProvider.EventWriteTransfer(m_regHandle, in eventDescriptor, eventHandle, activityID, childActivityID, dataCount, (EventData*)data);
+            WriteEventErrorCode status = m_eventProvider.EventWriteTransfer(in eventDescriptor, eventHandle, activityID, childActivityID, dataCount, (EventData*)data);
 
             if (status != 0)
             {
@@ -1162,7 +1100,6 @@ namespace System.Diagnostics.Tracing
             IntPtr data)
         {
             WriteEventErrorCode status = m_eventProvider.EventWriteTransfer(
-                m_regHandle,
                 in eventDescriptor,
                 eventHandle,
                 activityID,
@@ -1179,79 +1116,75 @@ namespace System.Diagnostics.Tracing
             return true;
         }
 
-        // These are look-alikes to the Manifest based ETW OS APIs that have been shimmed to work
-        // either with Manifest ETW or Classic ETW (if Manifest based ETW is not available).
-        private unsafe uint EventRegister(EventSource eventSource, Interop.Advapi32.EtwEnableCallback enableCallback)
-        {
-            m_providerName = eventSource.Name;
-            m_providerId = eventSource.Guid;
-            m_etwCallback = enableCallback;
-            return m_eventProvider.EventRegister(eventSource, enableCallback, null, ref m_regHandle);
-        }
-
-        private void EventUnregister(long registrationHandle) =>
-            m_eventProvider.EventUnregister(registrationHandle);
-
 #if TARGET_WINDOWS
-        private static bool m_setInformationMissing;
-
         internal unsafe int SetInformation(
             Interop.Advapi32.EVENT_INFO_CLASS eventInfoClass,
             void* data,
             uint dataSize)
         {
-            int status = Interop.Errors.ERROR_NOT_SUPPORTED;
-
-            if (!m_setInformationMissing)
-            {
-                try
-                {
-                    status = Interop.Advapi32.EventSetInformation(
-                        m_regHandle,
-                        eventInfoClass,
-                        data,
-                        dataSize);
-                }
-                catch (TypeLoadException)
-                {
-                    m_setInformationMissing = true;
-                }
-            }
-
-            return status;
+            return ((EtwEventProvider)m_eventProvider).SetInformation(eventInfoClass, data, dataSize);
         }
 #endif
     }
 
 #if TARGET_WINDOWS
-
     // A wrapper around the ETW-specific API calls.
     internal sealed class EtwEventProvider : IEventProvider
     {
+        private EventEnableCallback? _enableCallback;
+        private long _registrationHandle;
+        private GCHandle _gcHandle;
+
+        [UnmanagedCallersOnly]
+        private static unsafe void Callback(Guid* sourceId, int isEnabled, byte level,
+            long matchAnyKeywords, long matchAllKeywords, Interop.Advapi32.EVENT_FILTER_DESCRIPTOR* filterData, void* callbackContext)
+        {
+            ((EtwEventProvider)GCHandle.FromIntPtr((IntPtr)callbackContext).Target!)._enableCallback!(
+                isEnabled, level, matchAnyKeywords, matchAllKeywords, filterData);
+        }
+
         // Register an event provider.
-        unsafe uint IEventProvider.EventRegister(
+        unsafe void IEventProvider.EventRegister(
             EventSource eventSource,
-            Interop.Advapi32.EtwEnableCallback enableCallback,
-            void* callbackContext,
-            ref long registrationHandle)
+            EventEnableCallback enableCallback)
         {
+            _enableCallback = enableCallback;
+
+            Debug.Assert(!_gcHandle.IsAllocated);
+            _gcHandle = GCHandle.Alloc(this);
+
+            long registrationHandle = 0;
             Guid providerId = eventSource.Guid;
-            return Interop.Advapi32.EventRegister(
-                in providerId,
-                enableCallback,
-                callbackContext,
-                ref registrationHandle);
+            uint status = Interop.Advapi32.EventRegister(
+                &providerId,
+                &Callback,
+                (void*)GCHandle.ToIntPtr(_gcHandle),
+                &registrationHandle);
+            if (status != 0)
+            {
+                _gcHandle.Free();
+                throw new ArgumentException(Interop.Kernel32.GetMessage((int)status));
+            }
+            Debug.Assert(_registrationHandle == 0);
+            _registrationHandle = registrationHandle;
         }
 
         // Unregister an event provider.
-        uint IEventProvider.EventUnregister(long registrationHandle)
+        void IEventProvider.EventUnregister()
         {
-            return Interop.Advapi32.EventUnregister(registrationHandle);
+            if (_registrationHandle != 0)
+            {
+                Interop.Advapi32.EventUnregister(_registrationHandle);
+                _registrationHandle = 0;
+            }
+            if (_gcHandle.IsAllocated)
+            {
+                _gcHandle.Free();
+            }
         }
 
         // Write an event.
         unsafe EventProvider.WriteEventErrorCode IEventProvider.EventWriteTransfer(
-            long registrationHandle,
             in EventDescriptor eventDescriptor,
             IntPtr eventHandle,
             Guid* activityId,
@@ -1260,7 +1193,7 @@ namespace System.Diagnostics.Tracing
             EventProvider.EventData* userData)
         {
             int error = Interop.Advapi32.EventWriteTransfer(
-                registrationHandle,
+                _registrationHandle,
                 in eventDescriptor,
                 activityId,
                 relatedActivityId,
@@ -1293,27 +1226,51 @@ namespace System.Diagnostics.Tracing
         {
             throw new System.NotSupportedException();
         }
-    }
 
+
+        private static bool s_setInformationMissing;
+
+        internal unsafe int SetInformation(
+            Interop.Advapi32.EVENT_INFO_CLASS eventInfoClass,
+            void* data,
+            uint dataSize)
+        {
+            int status = Interop.Errors.ERROR_NOT_SUPPORTED;
+
+            if (!s_setInformationMissing)
+            {
+                try
+                {
+                    status = Interop.Advapi32.EventSetInformation(
+                        _registrationHandle,
+                        eventInfoClass,
+                        data,
+                        dataSize);
+                }
+                catch (TypeLoadException)
+                {
+                    s_setInformationMissing = true;
+                }
+            }
+
+            return status;
+        }
+    }
 #endif
+
     internal sealed class NoOpEventProvider : IEventProvider
     {
-        unsafe uint IEventProvider.EventRegister(
+        void IEventProvider.EventRegister(
             EventSource eventSource,
-            Interop.Advapi32.EtwEnableCallback enableCallback,
-            void* callbackContext,
-            ref long registrationHandle)
+            EventEnableCallback enableCallback)
         {
-            return 0;
         }
 
-        uint IEventProvider.EventUnregister(long registrationHandle)
+        void IEventProvider.EventUnregister()
         {
-            return 0;
         }
 
         unsafe EventProvider.WriteEventErrorCode IEventProvider.EventWriteTransfer(
-            long registrationHandle,
             in EventDescriptor eventDescriptor,
             IntPtr eventHandle,
             Guid* activityId,
index 5cd3003..56d4b20 100644 (file)
@@ -7,18 +7,15 @@ namespace System.Diagnostics.Tracing
     internal interface IEventProvider
     {
         // Register an event provider.
-        unsafe uint EventRegister(
+        unsafe void EventRegister(
             EventSource eventSource,
-            Interop.Advapi32.EtwEnableCallback enableCallback,
-            void* callbackContext,
-            ref long registrationHandle);
+            EventEnableCallback enableCallback);
 
         // Unregister an event provider.
-        uint EventUnregister(long registrationHandle);
+        void EventUnregister();
 
         // Write an event.
         unsafe EventProvider.WriteEventErrorCode EventWriteTransfer(
-            long registrationHandle,
             in EventDescriptor eventDescriptor,
             IntPtr eventHandle,
             Guid* activityId,
index 5c03699..a1a3b6c 100644 (file)
@@ -21,7 +21,12 @@ namespace System.Diagnostics.Tracing
         // These ICalls are used by EventSource to interact with the EventPipe.
         //
         [MethodImplAttribute(MethodImplOptions.InternalCall)]
-        internal static extern IntPtr CreateProvider(string providerName, Interop.Advapi32.EtwEnableCallback callbackFunc);
+        private static extern unsafe IntPtr CreateProvider(string providerName, IntPtr callbackFunc, IntPtr callbackContext);
+
+        internal static unsafe IntPtr CreateProvider(string providerName,
+            delegate* unmanaged<byte*, int, byte, long, long, Interop.Advapi32.EVENT_FILTER_DESCRIPTOR*, void*, void> callbackFunc,
+            void* callbackContext)
+            => CreateProvider(providerName, (IntPtr)callbackFunc, (IntPtr)callbackContext);
 
         [MethodImplAttribute(MethodImplOptions.InternalCall)]
         internal static extern unsafe IntPtr DefineEvent(IntPtr provHandle, uint eventID, long keywords, uint eventVersion, uint level, byte* pMetadata, uint metadataLength);
index 3865b31..3e465b2 100644 (file)
@@ -76,7 +76,6 @@ static EventPipeProvider *
 event_pipe_stub_create_provider (
        const ep_char8_t *provider_name,
        EventPipeCallback callback_func,
-       EventPipeCallbackDataFree callback_data_free_func,
        void *callback_data);
 
 static void
@@ -327,7 +326,6 @@ static EventPipeProvider *
 event_pipe_stub_create_provider (
        const ep_char8_t *provider_name,
        EventPipeCallback callback_func,
-       EventPipeCallbackDataFree callback_data_free_func,
        void *callback_data)
 {
        return (EventPipeProvider *)_max_event_pipe_type_size;
index af788ac..3ba274e 100644 (file)
@@ -101,7 +101,6 @@ typedef EventPipeProvider *
 (*event_pipe_component_create_provider_func) (
        const ep_char8_t *provider_name,
        EventPipeCallback callback_func,
-       EventPipeCallbackDataFree callback_data_free_func,
        void *callback_data);
 
 typedef void
index 5538d75..5dbc2fc 100644 (file)
@@ -116,7 +116,7 @@ buffer_manager_init (
 
        test_location = 3;
 
-       *provider = ep_create_provider (TEST_PROVIDER_NAME, NULL, NULL, NULL);
+       *provider = ep_create_provider (TEST_PROVIDER_NAME, NULL, NULL);
        ep_raise_error_if_nok (*provider != NULL);
 
        test_location = 4;
index b50546a..c4c0270 100644 (file)
@@ -98,7 +98,7 @@ load_buffer_with_events_init (
 
        test_location = 2;
 
-       *provider = ep_create_provider (TEST_PROVIDER_NAME, NULL, NULL, NULL);
+       *provider = ep_create_provider (TEST_PROVIDER_NAME, NULL, NULL);
        ep_raise_error_if_nok (*provider != NULL);
 
        test_location = 3;
index 9a00736..9bff205 100644 (file)
@@ -76,7 +76,7 @@ test_fast_serializer_object_fast_serialize (void)
 
        test_location = 2;
 
-       provider = ep_create_provider (TEST_PROVIDER_NAME, NULL, NULL, NULL);
+       provider = ep_create_provider (TEST_PROVIDER_NAME, NULL, NULL);
        ep_raise_error_if_nok (provider != NULL);
 
        test_location = 3;
index 742d383..e92d541 100644 (file)
@@ -79,7 +79,7 @@ test_file_write_event (EventPipeSerializationFormat format, bool write_event, bo
        test_location = 2;
 
        if (write_event) {
-               provider = ep_create_provider (TEST_PROVIDER_NAME, NULL, NULL, NULL);
+               provider = ep_create_provider (TEST_PROVIDER_NAME, NULL, NULL);
                ep_raise_error_if_nok (provider != NULL);
 
                test_location = 3;
index ddb0f4a..fd13622 100644 (file)
@@ -59,7 +59,7 @@ test_create_delete_provider (void)
        RESULT result = NULL;
        uint32_t test_location = 0;
 
-       EventPipeProvider *test_provider = ep_create_provider (TEST_PROVIDER_NAME, NULL, NULL, NULL);
+       EventPipeProvider *test_provider = ep_create_provider (TEST_PROVIDER_NAME, NULL, NULL);
        if (!test_provider) {
                result = FAILED ("Failed to create provider %s, ep_create_provider returned NULL", TEST_PROVIDER_NAME);
                ep_raise_error ();
@@ -113,7 +113,7 @@ test_get_provider (void)
        RESULT result = NULL;
        uint32_t test_location = 0;
 
-       EventPipeProvider *test_provider = ep_create_provider (TEST_PROVIDER_NAME, NULL, NULL, NULL);
+       EventPipeProvider *test_provider = ep_create_provider (TEST_PROVIDER_NAME, NULL, NULL);
        if (!test_provider) {
                result = FAILED ("Failed to create provider %s, ep_create_provider returned NULL", TEST_PROVIDER_NAME);
                ep_raise_error ();
@@ -157,7 +157,7 @@ test_create_same_provider_twice (void)
        EventPipeProvider *test_provider2 = NULL;
        EventPipeProvider *returned_test_provider = NULL;
 
-       test_provider = ep_create_provider (TEST_PROVIDER_NAME, NULL, NULL, NULL);
+       test_provider = ep_create_provider (TEST_PROVIDER_NAME, NULL, NULL);
        if (!test_provider) {
                result = FAILED ("Failed to create provider %s, ep_create_provider returned NULL", TEST_PROVIDER_NAME);
                ep_raise_error ();
@@ -173,7 +173,7 @@ test_create_same_provider_twice (void)
 
        test_location = 2;
 
-       test_provider2 = ep_create_provider (TEST_PROVIDER_NAME, NULL, NULL, NULL);
+       test_provider2 = ep_create_provider (TEST_PROVIDER_NAME, NULL, NULL);
        if (!test_provider2) {
                result = FAILED ("Creating to create an already existing provider %s", TEST_PROVIDER_NAME);
                ep_raise_error ();
@@ -646,7 +646,7 @@ test_create_delete_provider_with_callback (void)
 
        ep_start_streaming (session_id);
 
-       test_provider = ep_create_provider (TEST_PROVIDER_NAME, provider_callback, NULL, &provider_callback_data);
+       test_provider = ep_create_provider (TEST_PROVIDER_NAME, provider_callback, &provider_callback_data);
        ep_raise_error_if_nok (test_provider != NULL);
 
        test_location = 3;
@@ -679,7 +679,7 @@ test_build_event_metadata (void)
        EventPipeEventInstance *ep_event_instance = NULL;
        EventPipeEventMetadataEvent *metadata_event = NULL;
 
-       provider = ep_create_provider (TEST_PROVIDER_NAME, NULL, NULL, NULL);
+       provider = ep_create_provider (TEST_PROVIDER_NAME, NULL, NULL);
        ep_raise_error_if_nok (provider != NULL);
 
        test_location = 1;
@@ -776,7 +776,7 @@ test_session_write_event (void)
 
        test_location = 1;
 
-       provider = ep_create_provider (TEST_PROVIDER_NAME, NULL, NULL, NULL);
+       provider = ep_create_provider (TEST_PROVIDER_NAME, NULL, NULL);
        ep_raise_error_if_nok (provider != NULL);
 
        test_location = 2;
@@ -829,7 +829,7 @@ test_session_write_event_seq_point (void)
 
        test_location = 1;
 
-       provider = ep_create_provider (TEST_PROVIDER_NAME, NULL, NULL, NULL);
+       provider = ep_create_provider (TEST_PROVIDER_NAME, NULL, NULL);
        ep_raise_error_if_nok (provider != NULL);
 
        test_location = 2;
@@ -886,7 +886,7 @@ test_session_write_wait_get_next_event (void)
 
        test_location = 1;
 
-       provider = ep_create_provider (TEST_PROVIDER_NAME, NULL, NULL, NULL);
+       provider = ep_create_provider (TEST_PROVIDER_NAME, NULL, NULL);
        ep_raise_error_if_nok (provider != NULL);
 
        test_location = 2;
@@ -951,7 +951,7 @@ test_session_write_get_next_event (void)
 
        test_location = 1;
 
-       provider = ep_create_provider (TEST_PROVIDER_NAME, NULL, NULL, NULL);
+       provider = ep_create_provider (TEST_PROVIDER_NAME, NULL, NULL);
        ep_raise_error_if_nok (provider != NULL);
 
        test_location = 2;
@@ -1028,7 +1028,7 @@ test_session_write_suspend_event (void)
 
        test_location = 1;
 
-       provider = ep_create_provider (TEST_PROVIDER_NAME, NULL, NULL, NULL);
+       provider = ep_create_provider (TEST_PROVIDER_NAME, NULL, NULL);
        ep_raise_error_if_nok (provider != NULL);
 
        test_location = 2;
@@ -1088,7 +1088,7 @@ test_write_event (void)
 
        test_location = 1;
 
-       provider = ep_create_provider (TEST_PROVIDER_NAME, NULL, NULL, NULL);
+       provider = ep_create_provider (TEST_PROVIDER_NAME, NULL, NULL);
        ep_raise_error_if_nok (provider != NULL);
 
        test_location = 2;
@@ -1139,7 +1139,7 @@ test_write_get_next_event (void)
 
        test_location = 1;
 
-       provider = ep_create_provider (TEST_PROVIDER_NAME, NULL, NULL, NULL);
+       provider = ep_create_provider (TEST_PROVIDER_NAME, NULL, NULL);
        ep_raise_error_if_nok (provider != NULL);
 
        test_location = 2;
@@ -1199,7 +1199,7 @@ test_write_wait_get_next_event (void)
 
        test_location = 1;
 
-       provider = ep_create_provider (TEST_PROVIDER_NAME, NULL, NULL, NULL);
+       provider = ep_create_provider (TEST_PROVIDER_NAME, NULL, NULL);
        ep_raise_error_if_nok (provider != NULL);
 
        test_location = 2;
@@ -1279,7 +1279,7 @@ test_write_event_perf (void)
 
        test_location = 1;
 
-       provider = ep_create_provider (TEST_PROVIDER_NAME, NULL, NULL, NULL);
+       provider = ep_create_provider (TEST_PROVIDER_NAME, NULL, NULL);
        ep_raise_error_if_nok (provider != NULL);
 
        test_location = 2;
index eaad5ea..82d17fb 100644 (file)
@@ -157,7 +157,7 @@ NOHANDLES(ICALL(DEBUGR_2, "IsLogging", ves_icall_System_Diagnostics_Debugger_IsL
 NOHANDLES(ICALL(DEBUGR_3, "Log_icall", ves_icall_System_Diagnostics_Debugger_Log))
 
 ICALL_TYPE(EVENTPIPE, "System.Diagnostics.Tracing.EventPipeInternal", EVENTPIPE_1)
-HANDLES(EVENTPIPE_1, "CreateProvider", ves_icall_System_Diagnostics_Tracing_EventPipeInternal_CreateProvider, gconstpointer, 2, (MonoString, MonoDelegate))
+HANDLES(EVENTPIPE_1, "CreateProvider", ves_icall_System_Diagnostics_Tracing_EventPipeInternal_CreateProvider, gconstpointer, 3, (MonoString, gpointer, gpointer))
 NOHANDLES(ICALL(EVENTPIPE_2, "DefineEvent", ves_icall_System_Diagnostics_Tracing_EventPipeInternal_DefineEvent))
 NOHANDLES(ICALL(EVENTPIPE_3, "DeleteProvider", ves_icall_System_Diagnostics_Tracing_EventPipeInternal_DeleteProvider))
 NOHANDLES(ICALL(EVENTPIPE_4, "Disable", ves_icall_System_Diagnostics_Tracing_EventPipeInternal_Disable))
index 3c5b38c..595d8a3 100644 (file)
@@ -7,95 +7,23 @@
 #include <mono/metadata/components.h>
 #include <mono/metadata/assembly-internals.h>
 
-/*
- * Forward declares of all static functions.
- */
-
-static
-void
-delegate_callback_data_free_func (
-       EventPipeCallback callback_func,
-       void *callback_data);
-
-static
-void
-delegate_callback_func (
-       const uint8_t *source_id,
-       unsigned long is_enabled,
-       uint8_t level,
-       uint64_t match_any_keywords,
-       uint64_t match_all_keywords,
-       EventFilterDescriptor *filter_data,
-       void *callback_context);
-
-static
-void
-delegate_callback_data_free_func (
-       EventPipeCallback callback_func,
-       void *callback_data)
-{
-       if (callback_data)
-               mono_gchandle_free_internal ((MonoGCHandle)callback_data);
-}
-
-static
-void
-delegate_callback_func (
-       const uint8_t *source_id,
-       unsigned long is_enabled,
-       uint8_t level,
-       uint64_t match_any_keywords,
-       uint64_t match_all_keywords,
-       EventFilterDescriptor *filter_data,
-       void *callback_context)
-{
-
-       /*internal unsafe delegate void EtwEnableCallback(
-               in Guid sourceId,
-               int isEnabled,
-               byte level,
-               long matchAnyKeywords,
-               long matchAllKeywords,
-               EVENT_FILTER_DESCRIPTOR* filterData,
-               void* callbackContext);*/
-
-       MonoGCHandle delegate_object_handle = (MonoGCHandle)callback_context;
-       MonoObject *delegate_object = delegate_object_handle ? mono_gchandle_get_target_internal (delegate_object_handle) : NULL;
-       if (delegate_object) {
-               void *params [7];
-               params [0] = (void *)source_id;
-               params [1] = (void *)&is_enabled;
-               params [2] = (void *)&level;
-               params [3] = (void *)&match_any_keywords;
-               params [4] = (void *)&match_all_keywords;
-               params [5] = (void *)filter_data;
-               params [6] = NULL;
-
-               ERROR_DECL (error);
-               mono_runtime_delegate_invoke_checked (delegate_object, params, error);
-       }
-}
-
 gconstpointer
 ves_icall_System_Diagnostics_Tracing_EventPipeInternal_CreateProvider (
        MonoStringHandle provider_name,
-       MonoDelegateHandle callback_func,
+       gpointer callback_func,
+       gpointer callback_context,
        MonoError *error)
 {
        EventPipeProvider *provider = NULL;
-       void *callback_data = NULL;
 
        if (MONO_HANDLE_IS_NULL (provider_name)) {
                mono_error_set_argument_null (error, "providerName", "");
                return NULL;
        }
 
-       if (!MONO_HANDLE_IS_NULL (callback_func))
-               callback_data = (void *)mono_gchandle_new_weakref_internal (MONO_HANDLE_RAW (MONO_HANDLE_CAST (MonoObject, callback_func)), FALSE);
-
        char *provider_name_utf8 = mono_string_handle_to_utf8 (provider_name, error);
        if (is_ok (error) && provider_name_utf8) {
-               provider = mono_component_event_pipe ()->create_provider (provider_name_utf8, delegate_callback_func, delegate_callback_data_free_func, callback_data);
+               provider = mono_component_event_pipe ()->create_provider (provider_name_utf8, callback_func, callback_context);
        }
 
        g_free (provider_name_utf8);
@@ -506,7 +434,8 @@ ves_icall_System_Diagnostics_Tracing_NativeRuntimeEventSource_LogThreadPoolIOPac
 gconstpointer
 ves_icall_System_Diagnostics_Tracing_EventPipeInternal_CreateProvider (
        MonoStringHandle provider_name,
-       MonoDelegateHandle callback_func,
+       gpointer callback_func,
+       gpointer callback_context,
        MonoError *error)
 {
        mono_error_set_not_implemented (error, "System.Diagnostics.Tracing.EventPipeInternal.CreateProvider");
index 7a4891a..45f9ea9 100644 (file)
@@ -29,7 +29,6 @@ config_create_provider (
        EventPipeConfiguration *config,
        const ep_char8_t *provider_name,
        EventPipeCallback callback_func,
-       EventPipeCallbackDataFree callback_data_free_func,
        void *callback_data,
        EventPipeProviderCallbackDataQueue *provider_callback_data_queue);
 
index 9478b14..7199650 100644 (file)
@@ -173,7 +173,7 @@ ep_config_init (EventPipeConfiguration *config)
        ep_raise_error_if_nok (ep_rt_provider_list_is_valid (&config->provider_list));
 
        EP_LOCK_ENTER (section1)
-               config->config_provider = provider_create_register (ep_config_get_default_provider_name_utf8 (), NULL, NULL, NULL, provider_callback_data_queue);
+               config->config_provider = provider_create_register (ep_config_get_default_provider_name_utf8 (), NULL, NULL, provider_callback_data_queue);
        EP_LOCK_EXIT (section1)
 
        ep_raise_error_if_nok (config->config_provider != NULL);
@@ -239,7 +239,6 @@ ep_config_create_provider (
        EventPipeConfiguration *config,
        const ep_char8_t *provider_name,
        EventPipeCallback callback_func,
-       EventPipeCallbackDataFree callback_data_free_func,
        void *callback_data,
        EventPipeProviderCallbackDataQueue *provider_callback_data_queue)
 {
@@ -250,7 +249,7 @@ ep_config_create_provider (
 
        EventPipeProvider *provider = NULL;
        EP_LOCK_ENTER (section1)
-               provider = config_create_provider (config, provider_name, callback_func, callback_data_free_func, callback_data, provider_callback_data_queue);
+               provider = config_create_provider (config, provider_name, callback_func, callback_data, provider_callback_data_queue);
                ep_raise_error_if_nok_holding_lock (provider != NULL, section1);
        EP_LOCK_EXIT (section1)
 
@@ -461,7 +460,6 @@ config_create_provider (
        EventPipeConfiguration *config,
        const ep_char8_t *provider_name,
        EventPipeCallback callback_func,
-       EventPipeCallbackDataFree callback_data_free_func,
        void *callback_data,
        EventPipeProviderCallbackDataQueue *provider_callback_data_queue)
 {
@@ -470,7 +468,7 @@ config_create_provider (
 
        ep_requires_lock_held ();
 
-       EventPipeProvider *provider = ep_provider_alloc (config, provider_name, callback_func, callback_data_free_func, callback_data);
+       EventPipeProvider *provider = ep_provider_alloc (config, provider_name, callback_func, callback_data);
        ep_raise_error_if_nok (provider != NULL);
 
        config_register_provider (config, provider, provider_callback_data_queue);
index 6dd89c1..92a813d 100644 (file)
@@ -56,7 +56,6 @@ ep_config_create_provider (
        EventPipeConfiguration *config,
        const ep_char8_t *provider_name,
        EventPipeCallback callback_func,
-       EventPipeCallbackDataFree callback_data_free_func,
        void *callback_data,
        EventPipeProviderCallbackDataQueue *provider_callback_data_queue);
 
index 497de0e..2b1dccc 100644 (file)
@@ -98,7 +98,7 @@ ep_event_source_init (EventPipeEventSource *event_source)
 
        EP_ASSERT (event_source != NULL);
 
-       event_source->provider = ep_create_provider (ep_provider_get_default_name_utf8 (), NULL, NULL, NULL);
+       event_source->provider = ep_create_provider (ep_provider_get_default_name_utf8 (), NULL, NULL);
        ep_raise_error_if_nok (event_source->provider != NULL);
 
        event_source->provider_name = ep_provider_get_default_name_utf8 ();
index 68a695f..23bf2cb 100644 (file)
@@ -46,7 +46,6 @@ EventPipeProvider *
 provider_create_register (
        const ep_char8_t *provider_name,
        EventPipeCallback callback_func,
-       EventPipeCallbackDataFree callback_data_free_func,
        void *callback_data,
        EventPipeProviderCallbackDataQueue *provider_callback_data_queue);
 
index 31c838d..cd7d551 100644 (file)
@@ -166,7 +166,6 @@ ep_provider_alloc (
        EventPipeConfiguration *config,
        const ep_char8_t *provider_name,
        EventPipeCallback callback_func,
-       EventPipeCallbackDataFree callback_data_free_func,
        void *callback_data)
 {
        EP_ASSERT (config != NULL);
@@ -187,7 +186,6 @@ ep_provider_alloc (
        instance->keywords = 0;
        instance->provider_level = EP_EVENT_LEVEL_CRITICAL;
        instance->callback_func = callback_func;
-       instance->callback_data_free_func = callback_data_free_func;
        instance->callback_data = callback_data;
        instance->config = config;
        instance->delete_deferred = false;
@@ -209,9 +207,6 @@ ep_provider_free (EventPipeProvider * provider)
 
        ep_requires_lock_not_held ();
 
-       if (provider->callback_data_free_func)
-               provider->callback_data_free_func (provider->callback_func, provider->callback_data);
-
        if (!ep_rt_event_list_is_empty (&provider->event_list)) {
                EP_LOCK_ENTER (section1)
                ep_rt_event_list_free (&provider->event_list, event_free_func);
@@ -291,13 +286,7 @@ ep_provider_set_delete_deferred (
        EP_ASSERT (provider != NULL);
        provider->delete_deferred = deferred;
 
-       // EventSources will be collected once they ungregister themselves,
-       // so we can't call back in to them.
-       if (provider->callback_func && provider->callback_data_free_func)
-               provider->callback_data_free_func (provider->callback_func, provider->callback_data);
-
        provider->callback_func = NULL;
-       provider->callback_data_free_func = NULL;
        provider->callback_data = NULL;
 }
 
@@ -440,12 +429,11 @@ EventPipeProvider *
 provider_create_register (
        const ep_char8_t *provider_name,
        EventPipeCallback callback_func,
-       EventPipeCallbackDataFree callback_data_free_func,
        void *callback_data,
        EventPipeProviderCallbackDataQueue *provider_callback_data_queue)
 {
        ep_requires_lock_held ();
-       return config_create_provider (ep_config_get (), provider_name, callback_func, callback_data_free_func, callback_data, provider_callback_data_queue);
+       return config_create_provider (ep_config_get (), provider_name, callback_func, callback_data, provider_callback_data_queue);
 }
 
 void
@@ -464,9 +452,6 @@ provider_free (EventPipeProvider * provider)
 
        ep_requires_lock_held ();
 
-       if (provider->callback_data_free_func)
-               provider->callback_data_free_func (provider->callback_func, provider->callback_data);
-
        if (!ep_rt_event_list_is_empty (&provider->event_list))
                ep_rt_event_list_free (&provider->event_list, event_free_func);
 
index 8c6fda7..cae9bd3 100644 (file)
@@ -33,8 +33,6 @@ struct _EventPipeProvider_Internal {
        ep_rt_event_list_t event_list;
        // The optional provider callback function.
        EventPipeCallback callback_func;
-       // The optional provider callback_data free callback function.
-       EventPipeCallbackDataFree callback_data_free_func;
        // The optional provider callback data pointer.
        void *callback_data;
        // The configuration object.
@@ -96,7 +94,6 @@ ep_provider_alloc (
        EventPipeConfiguration *config,
        const ep_char8_t *provider_name,
        EventPipeCallback callback_func,
-       EventPipeCallbackDataFree callback_data_free_func,
        void *callback_data);
 
 void
index a62ce43..b1c10d7 100644 (file)
@@ -211,7 +211,7 @@ ep_sample_profiler_init (EventPipeProviderCallbackDataQueue *provider_callback_d
        ep_requires_lock_held ();
 
        if (!_sampling_provider) {
-               _sampling_provider = provider_create_register (ep_config_get_sample_profiler_provider_name_utf8 (), NULL, NULL, NULL, provider_callback_data_queue);
+               _sampling_provider = provider_create_register (ep_config_get_sample_profiler_provider_name_utf8 (), NULL, NULL, provider_callback_data_queue);
                ep_raise_error_if_nok (_sampling_provider != NULL);
                _thread_time_event = provider_add_event (
                        _sampling_provider,
index 6f61e85..71a0a28 100644 (file)
@@ -186,10 +186,6 @@ typedef void (*EventPipeCallback)(
        EventFilterDescriptor *filter_data,
        void *callback_data);
 
-typedef void (*EventPipeCallbackDataFree)(
-       EventPipeCallback callback,
-       void *callback_data);
-
 typedef void (*EventPipeSessionSynchronousCallback)(
        EventPipeProvider *provider,
        uint32_t event_id,
index 4dfb8bc..617fb47 100644 (file)
@@ -1205,7 +1205,6 @@ EventPipeProvider *
 ep_create_provider (
        const ep_char8_t *provider_name,
        EventPipeCallback callback_func,
-       EventPipeCallbackDataFree callback_data_free_func,
        void *callback_data)
 {
        ep_return_null_if_nok (provider_name != NULL);
@@ -1218,7 +1217,7 @@ ep_create_provider (
        EventPipeProviderCallbackDataQueue *provider_callback_data_queue = ep_provider_callback_data_queue_init (&data_queue);
 
        EP_LOCK_ENTER (section1)
-               provider = config_create_provider (ep_config_get (), provider_name, callback_func, callback_data_free_func, callback_data, provider_callback_data_queue);
+               provider = config_create_provider (ep_config_get (), provider_name, callback_func, callback_data, provider_callback_data_queue);
                ep_raise_error_if_nok_holding_lock (provider != NULL, section1);
        EP_LOCK_EXIT (section1)
 
index 29176c5..26ab94a 100644 (file)
@@ -164,7 +164,6 @@ EventPipeProvider *
 ep_create_provider (
        const ep_char8_t *provider_name,
        EventPipeCallback callback_func,
-       EventPipeCallbackDataFree callback_data_free_func,
        void *callback_data);
 
 void
index 932a842..ab4eac3 100644 (file)
@@ -432,7 +432,7 @@ internal sealed class PInvokeTableGenerator
             {
                 if (pindex > 0)
                     sb.Append(',');
-                sb.Append(MapType(method.GetParameters()[pindex].ParameterType));
+                sb.Append(MapType(p.ParameterType));
                 sb.Append($" arg{pindex}");
                 pindex++;
             }
@@ -443,7 +443,7 @@ internal sealed class PInvokeTableGenerator
             pindex = 0;
             if (!is_void)
             {
-                sb.Append("&res");
+                sb.Append("(int*)&res");
                 pindex++;
             }
             int aindex = 0;
@@ -451,7 +451,7 @@ internal sealed class PInvokeTableGenerator
             {
                 if (pindex > 0)
                     sb.Append(", ");
-                sb.Append($"&arg{aindex}");
+                sb.Append($"(int*)&arg{aindex}");
                 pindex++;
                 aindex++;
             }