# HG changeset patch # User cin # Date 1399260948 -14400 # Node ID edf0bc5585966541f6f0776fcae64684999ff8a8 # Parent 2c332a9c64c013d386c1617c4983cc8d28913b09 improved trace system diff -r 2c332a9c64c0 -r edf0bc558596 Implab/Diagnostics/TraceContext.cs --- a/Implab/Diagnostics/TraceContext.cs Sat Apr 26 23:36:00 2014 +0400 +++ b/Implab/Diagnostics/TraceContext.cs Mon May 05 07:35:48 2014 +0400 @@ -116,7 +116,7 @@ /// /// Копия текущего контекста трассировки. public static TraceContext Snapshot() { - return _current == null ? new TraceContext() : new TraceContext(_current); + return _current == null ? new TraceContext() : new TraceContext(_current,false); } /// @@ -131,7 +131,8 @@ try { action(); } finally { - _current.EndAllOperations(); + if(_current != null) + _current.EndAllOperations(); _current = old; } } @@ -197,6 +198,32 @@ } /// + /// Создает копию контекста и возвращается на предыдущую операцию в текущем контексте, это позволяет начать операцию в одном потоке, а завершить - в другом. + /// + /// Контекст трассировки, который можно присоединить к другому потоку. + public TraceContext DetachLogicalOperation() { + if (m_bound == m_currentOperation) { + return new TraceContext(); + } else { + var detached = new TraceContext(this, true); + m_currentOperation = m_currentOperation.Parent; + return detached; + } + } + + public void BindLogicalOperationToPromise(IPromiseBase promise) { + Safe.ArgumentNotNull(promise, "promise"); + + var ctx = DetachLogicalOperation(); + promise.Finally(() => { + var old = _current; + TraceContext.Attach(ctx); + TraceContext.Current.EndLogicalOperation(); + _current = old; + }); + } + + /// /// Заврешает все начатые в этом контексте операции /// public void EndAllOperations() { diff -r 2c332a9c64c0 -r edf0bc558596 Implab/Diagnostics/TraceEvent.cs --- a/Implab/Diagnostics/TraceEvent.cs Sat Apr 26 23:36:00 2014 +0400 +++ b/Implab/Diagnostics/TraceEvent.cs Mon May 05 07:35:48 2014 +0400 @@ -21,7 +21,10 @@ } public override string ToString() { - return String.Format("{0}: {1}", EventType, Message); + if (EventType == TraceEventType.Information) + return Message; + else + return String.Format("{0}: {1}", EventType, Message); } public static TraceEvent Create(TraceEventType type, string format, params object[] args) { diff -r 2c332a9c64c0 -r edf0bc558596 Implab/Diagnostics/TraceLog.cs --- a/Implab/Diagnostics/TraceLog.cs Sat Apr 26 23:36:00 2014 +0400 +++ b/Implab/Diagnostics/TraceLog.cs Mon May 05 07:35:48 2014 +0400 @@ -28,6 +28,11 @@ } [Conditional("TRACE")] + public static void BindLogicalOperationToPromise(IPromiseBase promise) { + TraceContext.Current.BindLogicalOperationToPromise(promise); + } + + [Conditional("TRACE")] public static void TraceInformation(string format, params object[] arguments) { LogChannel.Default.LogEvent(TraceEvent.Create(TraceEventType.Information, format, arguments)); }