diff Implab/Diagnostics/TraceContext.cs @ 48:d9d794b61bb9 interactive logger

Interactive tracing Improved working with tracing contexts
author cin
date Fri, 18 Apr 2014 12:34:45 +0400
parents 7c2369f580b8
children edf0bc558596
line wrap: on
line diff
--- a/Implab/Diagnostics/TraceContext.cs	Thu Apr 17 18:49:36 2014 +0400
+++ b/Implab/Diagnostics/TraceContext.cs	Fri Apr 18 12:34:45 2014 +0400
@@ -25,18 +25,24 @@
         /// </summary>
         public static TraceContext Current {
             get {
-                if (_current == null)
+                if (_current == null) {
                     _current = new TraceContext();
+                    _current.LogEvent(TraceEventType.Created,"[{0}]", _current.ThreadId);
+                }
                 return _current;
             }
         }
 
-        TraceContext(TraceContext context) {
+        TraceContext(TraceContext context)
+            : this(context, false) {
+        }
+
+        TraceContext(TraceContext context, bool attach) {
             if (context == null)
                 throw new ArgumentNullException("context");
 
             m_currentOperation = context.CurrentOperation;
-            m_bound = context.CurrentOperation;
+            m_bound = attach ? context.BoundOperation : context.CurrentOperation;
             m_threadId = Thread.CurrentThread.ManagedThreadId;
         }
 
@@ -57,15 +63,15 @@
         /// контексте ранее начатые логические операции не могут быть завершены.
         /// </para>
         /// <para>
-        /// Если передача состояния состоялась, то вызывается событие трассировки <see cref="TraceEventType.Transfer"/>.
+        /// Если передача состояния состоялась, то вызывается событие трассировки <see cref="TraceEventType.Fork"/>.
         /// </para>
         /// </remarks>
-        public static void Transfer(TraceContext from) {
+        public static void Fork(TraceContext from) {
             if (_current == from)
                 return;
             if (from != null) {
                 var context = new TraceContext(from);
-                context.LogEvent(TraceEventType.Transfer, "[{0}]-->[{1}]",from.ThreadId, context.ThreadId);
+                context.LogEvent(TraceEventType.Fork, "[{0}]-->[{1}]",from.ThreadId, context.ThreadId);
                 _current = context;
             } else {
                 _current = new TraceContext();
@@ -73,7 +79,40 @@
         }
 
         /// <summary>
-        /// Создает постоянную копию текущего контекста, данную копию можно хранить и использовать для передачи через <see cref="Transfer(TraceContext)"/>
+        /// Задает текущему потоку указанный контекст, текущей поток может заканчивать ранее начатые
+        /// логические операции в указанном контексте.
+        /// </summary>
+        /// <param name="source"></param>
+        public static void Attach(TraceContext source) {
+            if (_current == source)
+                return;
+            if (source != null) {
+                var context = new TraceContext(source, true);
+                context.LogEvent(TraceEventType.Attach, "[{0}]-->[{1}]", source.ThreadId, context.ThreadId);
+                _current = context;
+            } else {
+                _current = new TraceContext();
+            }
+        }
+
+        /// <summary>
+        /// Отсоединяет текущий контекст трассировки от потока, для дальнейшей его передачи другому потоку
+        /// <see cref="Attach(TraceContext)"/>.
+        /// </summary>
+        /// <returns>Контекст трассировки потока</returns>
+        /// <remarks>
+        /// После отсоединения контекста трассировки от потока, при первом обращении к трассировке в этом
+        /// потоке будет создан новый контекст.
+        /// </remarks>
+        public static TraceContext Detach() {
+            var context = Current;
+            context.LogEvent(TraceEventType.Detach, null);
+            _current = null;
+            return context;
+        }
+
+        /// <summary>
+        /// Создает постоянную копию текущего контекста, данную копию можно хранить и использовать для передачи через <see cref="Fork(TraceContext)"/>
         /// </summary>
         /// <returns>Копия текущего контекста трассировки.</returns>
         public static TraceContext Snapshot() {
@@ -88,7 +127,7 @@
             if (action == null)
                 throw new ArgumentNullException("action");
             var old = _current;
-            Transfer(this);
+            Fork(this);
             try {
                 action();
             } finally {