##// END OF EJS Templates
Reworked cancelation handling, if the cancel handler isn't specified the OperationCanceledException will be handled by the error handler...
Reworked cancelation handling, if the cancel handler isn't specified the OperationCanceledException will be handled by the error handler Any unhandled OperationCanceledException will cause the promise cancelation

File last commit:

r134:04d4c92d0f28 v2
r187:dd4a3590f9c6 ref20160224
Show More
TraceContext.cs
83 lines | 3.0 KiB | text/x-csharp | CSharpLexer
cin
rewritten tracing
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) {
cin
sync
r133 //var prev = CurrentOperation;
cin
Improved logging
r134 //LogChannel<TraceEvent>.Default.LogEvent(new TraceEvent(takeOwnership ? TraceEventType.Attach : TraceEventType.Enter, String.Format("{0} -> {1}",prev.Name, operation.Name)));
cin
rewritten tracing
r92 m_stack.Push(m_current);
m_current = new OperationContext(operation, takeOwnership);
}
public void StartLogicalOperation(string name) {
cin
Improved logging
r134 LogChannel<TraceEvent>.Default.LogEvent(new TraceEvent(TraceEventType.OperationStarted, name));
cin
rewritten tracing
r92 m_current.BeginLogicalOperation(name);
}
public void StartLogicalOperation() {
cin
improved tracing...
r93 StartLogicalOperation(String.Empty);
cin
rewritten tracing
r92 }
public void EndLogicalOperation() {
cin
Improved logging
r134 var op = m_current.EndLogicalOperation();
LogChannel<TraceEvent>.Default.LogEvent(new TraceEvent(TraceEventType.OperationCompleted, String.Format("-{0} : {1}ms",op.Name, op.Duration)));
cin
rewritten tracing
r92 }
public LogicalOperation DetachLogicalOperation() {
cin
minor fixes
r94 var prev = m_current.DetachLogicalOperation();
cin
sync
r133 //LogChannel<TraceEvent>.Default.LogEvent(new TraceEvent(TraceEventType.Detach, String.Format("{0} -> {1}",prev.Name, CurrentOperation.Name)));
cin
minor fixes
r94 return prev;
cin
rewritten tracing
r92 }
public void Leave() {
cin
improved tracing...
r93 if (m_stack.Count > 0) {
m_current.Leave();
cin
sync
r133 //var prev = CurrentOperation;
cin
rewritten tracing
r92 m_current = m_stack.Pop();
cin
sync
r133 //LogChannel<TraceEvent>.Default.LogEvent(new TraceEvent(TraceEventType.Leave, String.Format("{0} -> {1}", prev.Name, CurrentOperation.Name)));
cin
improved tracing...
r93 } else {
cin
Promises rewritten, added improved version of AsyncQueue
r119 TraceLog.TraceWarning("Attempt to leave the last operation context");
cin
rewritten tracing
r92 m_current = OperationContext.EMPTY;
}
}
}
}