comparison 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
comparison
equal deleted inserted replaced
47:b181f7bcb259 48:d9d794b61bb9
23 /// <summary> 23 /// <summary>
24 /// Текущий контекст трассировки для потока, создается астоматически при первом обращении. 24 /// Текущий контекст трассировки для потока, создается астоматически при первом обращении.
25 /// </summary> 25 /// </summary>
26 public static TraceContext Current { 26 public static TraceContext Current {
27 get { 27 get {
28 if (_current == null) 28 if (_current == null) {
29 _current = new TraceContext(); 29 _current = new TraceContext();
30 _current.LogEvent(TraceEventType.Created,"[{0}]", _current.ThreadId);
31 }
30 return _current; 32 return _current;
31 } 33 }
32 } 34 }
33 35
34 TraceContext(TraceContext context) { 36 TraceContext(TraceContext context)
37 : this(context, false) {
38 }
39
40 TraceContext(TraceContext context, bool attach) {
35 if (context == null) 41 if (context == null)
36 throw new ArgumentNullException("context"); 42 throw new ArgumentNullException("context");
37 43
38 m_currentOperation = context.CurrentOperation; 44 m_currentOperation = context.CurrentOperation;
39 m_bound = context.CurrentOperation; 45 m_bound = attach ? context.BoundOperation : context.CurrentOperation;
40 m_threadId = Thread.CurrentThread.ManagedThreadId; 46 m_threadId = Thread.CurrentThread.ManagedThreadId;
41 } 47 }
42 48
43 TraceContext() { 49 TraceContext() {
44 m_currentOperation = new LogicalOperation(); 50 m_currentOperation = new LogicalOperation();
55 /// Копирование происходит за счет создания нового контекста трассировки и заполнением его 61 /// Копирование происходит за счет создания нового контекста трассировки и заполнением его
56 /// состояния из переданного контекста. При этом копируется стек операций, однако в новом 62 /// состояния из переданного контекста. При этом копируется стек операций, однако в новом
57 /// контексте ранее начатые логические операции не могут быть завершены. 63 /// контексте ранее начатые логические операции не могут быть завершены.
58 /// </para> 64 /// </para>
59 /// <para> 65 /// <para>
60 /// Если передача состояния состоялась, то вызывается событие трассировки <see cref="TraceEventType.Transfer"/>. 66 /// Если передача состояния состоялась, то вызывается событие трассировки <see cref="TraceEventType.Fork"/>.
61 /// </para> 67 /// </para>
62 /// </remarks> 68 /// </remarks>
63 public static void Transfer(TraceContext from) { 69 public static void Fork(TraceContext from) {
64 if (_current == from) 70 if (_current == from)
65 return; 71 return;
66 if (from != null) { 72 if (from != null) {
67 var context = new TraceContext(from); 73 var context = new TraceContext(from);
68 context.LogEvent(TraceEventType.Transfer, "[{0}]-->[{1}]",from.ThreadId, context.ThreadId); 74 context.LogEvent(TraceEventType.Fork, "[{0}]-->[{1}]",from.ThreadId, context.ThreadId);
69 _current = context; 75 _current = context;
70 } else { 76 } else {
71 _current = new TraceContext(); 77 _current = new TraceContext();
72 } 78 }
73 } 79 }
74 80
75 /// <summary> 81 /// <summary>
76 /// Создает постоянную копию текущего контекста, данную копию можно хранить и использовать для передачи через <see cref="Transfer(TraceContext)"/> 82 /// Задает текущему потоку указанный контекст, текущей поток может заканчивать ранее начатые
83 /// логические операции в указанном контексте.
84 /// </summary>
85 /// <param name="source"></param>
86 public static void Attach(TraceContext source) {
87 if (_current == source)
88 return;
89 if (source != null) {
90 var context = new TraceContext(source, true);
91 context.LogEvent(TraceEventType.Attach, "[{0}]-->[{1}]", source.ThreadId, context.ThreadId);
92 _current = context;
93 } else {
94 _current = new TraceContext();
95 }
96 }
97
98 /// <summary>
99 /// Отсоединяет текущий контекст трассировки от потока, для дальнейшей его передачи другому потоку
100 /// <see cref="Attach(TraceContext)"/>.
101 /// </summary>
102 /// <returns>Контекст трассировки потока</returns>
103 /// <remarks>
104 /// После отсоединения контекста трассировки от потока, при первом обращении к трассировке в этом
105 /// потоке будет создан новый контекст.
106 /// </remarks>
107 public static TraceContext Detach() {
108 var context = Current;
109 context.LogEvent(TraceEventType.Detach, null);
110 _current = null;
111 return context;
112 }
113
114 /// <summary>
115 /// Создает постоянную копию текущего контекста, данную копию можно хранить и использовать для передачи через <see cref="Fork(TraceContext)"/>
77 /// </summary> 116 /// </summary>
78 /// <returns>Копия текущего контекста трассировки.</returns> 117 /// <returns>Копия текущего контекста трассировки.</returns>
79 public static TraceContext Snapshot() { 118 public static TraceContext Snapshot() {
80 return _current == null ? new TraceContext() : new TraceContext(_current); 119 return _current == null ? new TraceContext() : new TraceContext(_current);
81 } 120 }
86 /// <param name="action"></param> 125 /// <param name="action"></param>
87 public void Invoke(Action action) { 126 public void Invoke(Action action) {
88 if (action == null) 127 if (action == null)
89 throw new ArgumentNullException("action"); 128 throw new ArgumentNullException("action");
90 var old = _current; 129 var old = _current;
91 Transfer(this); 130 Fork(this);
92 try { 131 try {
93 action(); 132 action();
94 } finally { 133 } finally {
95 _current.EndAllOperations(); 134 _current.EndAllOperations();
96 _current = old; 135 _current = old;