//------------------------------------------------------------------------------ // // Copyright (c) Microsoft Corporation. All rights reserved. // // [....] //------------------------------------------------------------------------------ namespace System.Data.Common { using System; using System.Data; using System.Threading; using System.Diagnostics; using System.Globalization; /// /// This class defines the data strucutre for ActvitiyId used for correlated tracing between client (bid trace event) and server (XEvent). /// It also includes all the APIs used to access the ActivityId. Note: ActivityId is thread based which is stored in TLS. /// internal static class ActivityCorrelator { internal const Bid.ApiGroup CorrelationTracePoints = Bid.ApiGroup.Correlation; internal class ActivityId { internal Guid Id { get; private set; } internal UInt32 Sequence { get; private set; } internal ActivityId() { this.Id = Guid.NewGuid(); this.Sequence = 0; // the first event will start 1 } // copy-constructor internal ActivityId(ActivityId activity) { this.Id = activity.Id; this.Sequence = activity.Sequence; } internal void Increment() { unchecked { ++this.Sequence; } } public override string ToString() { return string.Format(CultureInfo.InvariantCulture, "{0}:{1}", this.Id, this.Sequence); } } // Declare the ActivityId which will be stored in TLS. The Id is unique for each thread. // The Sequence number will be incremented when each event happens. // Correlation along threads is consistent with the current XEvent mechanisam at server. [ThreadStaticAttribute] static ActivityId tlsActivity; /// /// Get the current ActivityId /// internal static ActivityId Current { get { if (tlsActivity == null) { tlsActivity = new ActivityId(); } return new ActivityId(tlsActivity); } } /// /// Increment the sequence number and generate the new ActviityId /// /// ActivityId internal static ActivityId Next() { if (tlsActivity == null) { tlsActivity = new ActivityId(); } tlsActivity.Increment(); return new ActivityId(tlsActivity); } } }