144 lines
5.1 KiB
C#
144 lines
5.1 KiB
C#
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
//
|
|
// File: EventSource.cs
|
|
//
|
|
//
|
|
//
|
|
|
|
using System;
|
|
using System.Threading;
|
|
using Microsoft.Singularity.Eventing;
|
|
using System.Runtime.InteropServices;
|
|
using System.Runtime.CompilerServices;
|
|
using Microsoft.Singularity.V1.Services;
|
|
|
|
namespace Microsoft.Singularity.Eventing
|
|
{
|
|
[CLSCompliant(false)]
|
|
[AccessedByRuntime("output to header : defined in MemoryStorage.cpp")]
|
|
public class EventSource
|
|
{
|
|
public string SourceName;
|
|
public EventingStorage Storage;
|
|
public uint ControlFlags;
|
|
public UIntPtr SourceHandle = 0;
|
|
|
|
public Controller HostController;
|
|
|
|
[AccessedByRuntime("referenced in c++")]
|
|
public const uint CAPTURE_STACK_TRACE = 1;
|
|
|
|
[AccessedByRuntime("referenced in c++")]
|
|
public const uint CAPTURE_DEBUG_PRINT = 2;
|
|
|
|
[AccessedByRuntime("referenced in c++")]
|
|
public const uint ENABLE_ALL_MASK = 0xffff0000;
|
|
|
|
~EventSource()
|
|
{
|
|
HostController.UnRegisterSource(this);
|
|
}
|
|
|
|
public EventSource()
|
|
{
|
|
}
|
|
|
|
public EventSource(Controller controller, string sourceName, UIntPtr storageHandle)
|
|
{
|
|
SourceName= sourceName;
|
|
Storage = EventingStorage.CreateStorageFromHandle(storageHandle);
|
|
ControlFlags = ENABLE_ALL_MASK;
|
|
HostController = controller;
|
|
}
|
|
|
|
|
|
public EventSource(string sourceName, EventingStorage storage, uint controlFlags)
|
|
{
|
|
SourceName= sourceName;
|
|
Storage = storage;
|
|
ControlFlags = controlFlags;
|
|
if (storage != null) {
|
|
HostController = storage.GetController();
|
|
} else {
|
|
HostController = Controller.GetLocalController();
|
|
}
|
|
}
|
|
|
|
public virtual void RegisterEnumSymbols()
|
|
{
|
|
}
|
|
|
|
public virtual bool Register()
|
|
{
|
|
return (HostController != null) && HostController.RegisterSource(this);
|
|
}
|
|
|
|
[NoHeapAllocation]
|
|
public unsafe UIntPtr LogEntry(uint Flags, UIntPtr eventType, byte * Buffer, int Size) {
|
|
|
|
return LogSourceEntryImpl(SourceHandle, Flags, eventType, Buffer, Size);
|
|
}
|
|
|
|
[NoHeapAllocation]
|
|
public unsafe UIntPtr LogEntry(uint Flags, UIntPtr eventType, byte * Buffer, int Size,
|
|
int stringsCount, ArrayType * strings)
|
|
{
|
|
return LogSourceEntryImpl(SourceHandle, Flags, eventType, Buffer, Size, stringsCount, strings);
|
|
}
|
|
|
|
[AccessedByRuntime("output to header : defined in MemoryStorage.cpp")]
|
|
[MethodImpl(MethodImplOptions.InternalCall)]
|
|
[StackBound(256)]
|
|
[NoHeapAllocation]
|
|
static public extern unsafe UIntPtr LogSourceEntryImpl(UIntPtr sourceHandle,
|
|
uint Flags,
|
|
UIntPtr eventType,
|
|
byte * Buffer,
|
|
int size);
|
|
|
|
[AccessedByRuntime("output to header : defined in MemoryStorage.cpp")]
|
|
[MethodImpl(MethodImplOptions.InternalCall)]
|
|
[StackBound(256)]
|
|
[NoHeapAllocation]
|
|
static public extern unsafe UIntPtr LogSourceEntryImpl(UIntPtr sourceHandle,
|
|
uint Flags,
|
|
UIntPtr eventType,
|
|
byte * Buffer,
|
|
int size,
|
|
int arraysCount,
|
|
ArrayType * arrays);
|
|
}
|
|
|
|
[CLSCompliant(false)]
|
|
public abstract class ActiveSource : EventSource
|
|
{
|
|
public UIntPtr EventTypeHandle = 0;
|
|
public UIntPtr DebugBufferAddress = 0;
|
|
public ushort Count;
|
|
public ushort EntrySize;
|
|
|
|
public ActiveSource(string sourceName, int count, uint controlFlags)
|
|
: base(sourceName, null, controlFlags)
|
|
{
|
|
HostController = Controller.GetLocalController();
|
|
Count = (ushort)count;
|
|
}
|
|
|
|
public virtual unsafe bool GetActiveEntry(int index,
|
|
UIntPtr * type,
|
|
byte * buffer,
|
|
UInt16 bufferSize )
|
|
{
|
|
if ((index < 0) || (index >= Count) || (EntrySize > bufferSize)) {
|
|
|
|
return false;
|
|
}
|
|
*type = EventTypeHandle;
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
|