You've already forked linux-packaging-mono
							
							
		
			
	
	
		
			94 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			94 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
|   | // <copyright> | ||
|  | //   Copyright (c) Microsoft Corporation.  All rights reserved. | ||
|  | // </copyright> | ||
|  | 
 | ||
|  | namespace System.Runtime.Diagnostics | ||
|  | { | ||
|  |     using System; | ||
|  |     using System.Diagnostics; | ||
|  |     using System.Diagnostics.CodeAnalysis; | ||
|  |     using System.Runtime.CompilerServices; | ||
|  |     using System.Runtime.Interop; | ||
|  |     using System.Security; | ||
|  | 
 | ||
|  |     internal class EventTraceActivity | ||
|  |     { | ||
|  |         // This field is public because it needs to be passed by reference for P/Invoke | ||
|  |         public Guid ActivityId; | ||
|  |         static EventTraceActivity empty; | ||
|  | 
 | ||
|  |         public EventTraceActivity(bool setOnThread = false) | ||
|  |             : this(Guid.NewGuid(), setOnThread) | ||
|  |         { | ||
|  |         } | ||
|  | 
 | ||
|  |         public EventTraceActivity(Guid guid, bool setOnThread = false) | ||
|  |         { | ||
|  |             this.ActivityId = guid; | ||
|  |             if (setOnThread) | ||
|  |             { | ||
|  |                 SetActivityIdOnThread(); | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  | 
 | ||
|  |         public static EventTraceActivity Empty | ||
|  |         { | ||
|  |             get  | ||
|  |             { | ||
|  |                 if (empty == null) | ||
|  |                 { | ||
|  |                     empty = new EventTraceActivity(Guid.Empty); | ||
|  |                 } | ||
|  | 
 | ||
|  |                 return empty; | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         public static string Name | ||
|  |         { | ||
|  |             get { return "E2EActivity"; } | ||
|  |         } | ||
|  | 
 | ||
|  |         [Fx.Tag.SecurityNote(Critical = "Critical because the CorrelationManager property has a link demand on UnmanagedCode.", | ||
|  |             Safe = "We do not leak security data.")] | ||
|  |         [SecuritySafeCritical] | ||
|  |         public static EventTraceActivity GetFromThreadOrCreate(bool clearIdOnThread = false) | ||
|  |         { | ||
|  |             Guid guid = Trace.CorrelationManager.ActivityId; | ||
|  |             if (guid == Guid.Empty) | ||
|  |             { | ||
|  |                 guid = Guid.NewGuid(); | ||
|  |             } | ||
|  |             else if (clearIdOnThread) | ||
|  |             { | ||
|  |                 // Reset the ActivityId on the thread to avoid using the same Id again | ||
|  |                 Trace.CorrelationManager.ActivityId = Guid.Empty; | ||
|  |             } | ||
|  | 
 | ||
|  |             return new EventTraceActivity(guid); | ||
|  |         } | ||
|  | 
 | ||
|  |         [Fx.Tag.SecurityNote(Critical = "Critical because the CorrelationManager property has a link demand on UnmanagedCode.", | ||
|  |             Safe = "We do not leak security data.")] | ||
|  |         [SecuritySafeCritical] | ||
|  |         public static Guid GetActivityIdFromThread() | ||
|  |         { | ||
|  |             return Trace.CorrelationManager.ActivityId; | ||
|  |         } | ||
|  | 
 | ||
|  |         public void SetActivityId(Guid guid) | ||
|  |         { | ||
|  |             this.ActivityId = guid; | ||
|  |         } | ||
|  | 
 | ||
|  |         [Fx.Tag.SecurityNote(Critical = "Critical because the CorrelationManager property has a link demand on UnmanagedCode.", | ||
|  |             Safe = "We do not leak security data.")] | ||
|  |         [SecuritySafeCritical] | ||
|  |         void SetActivityIdOnThread() | ||
|  |         { | ||
|  |             Trace.CorrelationManager.ActivityId = this.ActivityId; | ||
|  |         } | ||
|  |     } | ||
|  | } |