TraceContext.cs
82 lines
| 2.9 KiB
| text/x-csharp
|
CSharpLexer
|
|
r92 | using System; | ||
| using System.Collections.Generic; | ||||
| using System.Threading; | ||||
| namespace Implab.Diagnostics { | ||||
| /// <summary> | ||||
| /// Trace context is bound to the specific thread, each thread has it's own ThreadContext. | ||||
| /// </summary> | ||||
| /// <remarks> | ||||
| /// ThreadContext manages relations between logical operations and threads. | ||||
| /// </remarks> | ||||
| public class TraceContext { | ||||
| [ThreadStatic] | ||||
| static TraceContext _instance; | ||||
| OperationContext m_current = OperationContext.EMPTY; | ||||
| readonly Stack<OperationContext> m_stack = new Stack<OperationContext>(); | ||||
| readonly int m_threadId; | ||||
| public static TraceContext Instance { | ||||
| get { | ||||
| if (_instance == null) | ||||
| _instance = new TraceContext(); | ||||
| return _instance; | ||||
| } | ||||
| } | ||||
| public TraceContext() { | ||||
| m_threadId = Thread.CurrentThread.ManagedThreadId; | ||||
| } | ||||
| public int ThreadId { | ||||
| get { return m_threadId; } | ||||
| } | ||||
| public LogicalOperation CurrentOperation { | ||||
| get { | ||||
| return m_current.CurrentOperation; | ||||
| } | ||||
| } | ||||
| public void EnterLogicalOperation(LogicalOperation operation, bool takeOwnership) { | ||||
|
|
r133 | //var prev = CurrentOperation; | ||
|
|
r134 | //LogChannel<TraceEvent>.Default.LogEvent(new TraceEvent(takeOwnership ? TraceEventType.Attach : TraceEventType.Enter, String.Format("{0} -> {1}",prev.Name, operation.Name))); | ||
|
|
r92 | m_stack.Push(m_current); | ||
| m_current = new OperationContext(operation, takeOwnership); | ||||
| } | ||||
| public void StartLogicalOperation(string name) { | ||||
|
|
r200 | LogChannel<TraceEvent>.Default.LogEvent(new TraceEvent(TraceContext.Instance.CurrentOperation, TraceEventType.OperationStarted, name)); | ||
|
|
r92 | m_current.BeginLogicalOperation(name); | ||
| } | ||||
| public void StartLogicalOperation() { | ||||
|
|
r93 | StartLogicalOperation(String.Empty); | ||
|
|
r92 | } | ||
|
|
r195 | public LogicalOperation EndLogicalOperation() { | ||
| return m_current.EndLogicalOperation(); | ||||
|
|
r92 | } | ||
| public LogicalOperation DetachLogicalOperation() { | ||||
|
|
r94 | var prev = m_current.DetachLogicalOperation(); | ||
|
|
r133 | //LogChannel<TraceEvent>.Default.LogEvent(new TraceEvent(TraceEventType.Detach, String.Format("{0} -> {1}",prev.Name, CurrentOperation.Name))); | ||
|
|
r94 | return prev; | ||
|
|
r92 | } | ||
| public void Leave() { | ||||
|
|
r93 | if (m_stack.Count > 0) { | ||
| m_current.Leave(); | ||||
|
|
r133 | //var prev = CurrentOperation; | ||
|
|
r92 | m_current = m_stack.Pop(); | ||
|
|
r133 | //LogChannel<TraceEvent>.Default.LogEvent(new TraceEvent(TraceEventType.Leave, String.Format("{0} -> {1}", prev.Name, CurrentOperation.Name))); | ||
|
|
r93 | } else { | ||
|
|
r119 | TraceLog.TraceWarning("Attempt to leave the last operation context"); | ||
|
|
r92 | m_current = OperationContext.EMPTY; | ||
| } | ||||
| } | ||||
| } | ||||
| } | ||||
