Mercurial > pub > ImplabNet
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 {