// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System; using System.Diagnostics.CodeAnalysis; using System.Runtime.InteropServices; namespace System.Diagnostics.Tracing { [StructLayout(LayoutKind.Explicit, Size = 16)] internal readonly struct EventDescriptor : IEquatable<EventDescriptor> { #region private [FieldOffset(0)] private readonly int m_traceloggingId; [FieldOffset(0)] private readonly ushort m_id; [FieldOffset(2)] private readonly byte m_version; [FieldOffset(3)] private readonly byte m_channel; [FieldOffset(4)] private readonly byte m_level; [FieldOffset(5)] private readonly byte m_opcode; [FieldOffset(6)] private readonly ushort m_task; [FieldOffset(8)] private readonly long m_keywords; #endregion public EventDescriptor( int traceloggingId, byte level, byte opcode, long keywords ) { this.m_id = 0; this.m_version = 0; this.m_channel = 0; this.m_traceloggingId = traceloggingId; this.m_level = level; this.m_opcode = opcode; this.m_task = 0; this.m_keywords = keywords; } public EventDescriptor( int id, byte version, byte channel, byte level, byte opcode, int task, long keywords ) { ArgumentOutOfRangeException.ThrowIfNegative(id); if (id > ushort.MaxValue) { throw new ArgumentOutOfRangeException(nameof(id), SR.Format(SR.ArgumentOutOfRange_NeedValidId, 1, ushort.MaxValue)); } m_traceloggingId = 0; m_id = (ushort)id; m_version = version; m_channel = channel; m_level = level; m_opcode = opcode; m_keywords = keywords; ArgumentOutOfRangeException.ThrowIfNegative(task); if (task > ushort.MaxValue) { throw new ArgumentOutOfRangeException(nameof(task), SR.Format(SR.ArgumentOutOfRange_NeedValidId, 1, ushort.MaxValue)); } m_task = (ushort)task; } public int EventId => m_id; public byte Version => m_version; public byte Channel => m_channel; public byte Level => m_level; public byte Opcode => m_opcode; public int Task => m_task; public long Keywords => m_keywords; internal int TraceLoggingId => m_traceloggingId; public override bool Equals([NotNullWhen(true)] object? obj) => obj is EventDescriptor ed && Equals(ed); public override int GetHashCode() => m_id ^ m_version ^ m_channel ^ m_level ^ m_opcode ^ m_task ^ (int)m_keywords; public bool Equals(EventDescriptor other) => m_id == other.m_id && m_version == other.m_version && m_channel == other.m_channel && m_level == other.m_level && m_opcode == other.m_opcode && m_task == other.m_task && m_keywords == other.m_keywords; public static bool operator ==(EventDescriptor event1, EventDescriptor event2) => event1.Equals(event2); public static bool operator !=(EventDescriptor event1, EventDescriptor event2) => !event1.Equals(event2); } } |