// 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);
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;
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
{
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;
}
extern "C" INT_PTR QCALLTYPE EventPipeInternal_CreateProvider(
_In_z_ LPCWSTR providerName,
- EventPipeCallback pCallbackFunc)
+ EventPipeCallback pCallbackFunc,
+ void* pCallbackContext)
{
QCALL_CONTRACT;
BEGIN_QCALL;
- pProvider = EventPipeAdapter::CreateProvider(providerName, pCallbackFunc);
+ pProvider = EventPipeAdapter::CreateProvider(providerName, pCallbackFunc, pCallbackContext);
END_QCALL;
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,
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);
}
}
{
[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);
}
}
// 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,
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.
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)
}
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
/// 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));
}
//
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)
{
//
// 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;
}
//
// We solve by Unregistering after releasing the EventListenerLock.
Debug.Assert(!Monitor.IsEntered(EventListener.EventListenersLock));
- if (registrationHandle != 0)
- EventUnregister(registrationHandle);
+ m_eventProvider.EventUnregister();
}
/// <summary>
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.
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)
/*++
/// <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;
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
}
}
- 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)
{
/// <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)
(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)
{
IntPtr data)
{
WriteEventErrorCode status = m_eventProvider.EventWriteTransfer(
- m_regHandle,
in eventDescriptor,
eventHandle,
activityID,
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),
+ ®istrationHandle);
+ 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,
EventProvider.EventData* userData)
{
int error = Interop.Advapi32.EventWriteTransfer(
- registrationHandle,
+ _registrationHandle,
in eventDescriptor,
activityId,
relatedActivityId,
{
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,
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,
// 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);
event_pipe_stub_create_provider (
const ep_char8_t *provider_name,
EventPipeCallback callback_func,
- EventPipeCallbackDataFree callback_data_free_func,
void *callback_data);
static void
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;
(*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
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;
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;
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;
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;
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 ();
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 ();
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 ();
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 ();
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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))
#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);
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");
EventPipeConfiguration *config,
const ep_char8_t *provider_name,
EventPipeCallback callback_func,
- EventPipeCallbackDataFree callback_data_free_func,
void *callback_data,
EventPipeProviderCallbackDataQueue *provider_callback_data_queue);
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);
EventPipeConfiguration *config,
const ep_char8_t *provider_name,
EventPipeCallback callback_func,
- EventPipeCallbackDataFree callback_data_free_func,
void *callback_data,
EventPipeProviderCallbackDataQueue *provider_callback_data_queue)
{
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)
EventPipeConfiguration *config,
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 ();
- 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);
EventPipeConfiguration *config,
const ep_char8_t *provider_name,
EventPipeCallback callback_func,
- EventPipeCallbackDataFree callback_data_free_func,
void *callback_data,
EventPipeProviderCallbackDataQueue *provider_callback_data_queue);
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 ();
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);
EventPipeConfiguration *config,
const ep_char8_t *provider_name,
EventPipeCallback callback_func,
- EventPipeCallbackDataFree callback_data_free_func,
void *callback_data)
{
EP_ASSERT (config != NULL);
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;
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);
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;
}
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
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);
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.
EventPipeConfiguration *config,
const ep_char8_t *provider_name,
EventPipeCallback callback_func,
- EventPipeCallbackDataFree callback_data_free_func,
void *callback_data);
void
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,
EventFilterDescriptor *filter_data,
void *callback_data);
-typedef void (*EventPipeCallbackDataFree)(
- EventPipeCallback callback,
- void *callback_data);
-
typedef void (*EventPipeSessionSynchronousCallback)(
EventPipeProvider *provider,
uint32_t event_id,
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);
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)
ep_create_provider (
const ep_char8_t *provider_name,
EventPipeCallback callback_func,
- EventPipeCallbackDataFree callback_data_free_func,
void *callback_data);
void
{
if (pindex > 0)
sb.Append(',');
- sb.Append(MapType(method.GetParameters()[pindex].ParameterType));
+ sb.Append(MapType(p.ParameterType));
sb.Append($" arg{pindex}");
pindex++;
}
pindex = 0;
if (!is_void)
{
- sb.Append("&res");
+ sb.Append("(int*)&res");
pindex++;
}
int aindex = 0;
{
if (pindex > 0)
sb.Append(", ");
- sb.Append($"&arg{aindex}");
+ sb.Append($"(int*)&arg{aindex}");
pindex++;
aindex++;
}