# 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));
}