comparison Implab/Diagnostics/TraceContext.cs @ 52:edf0bc558596

improved trace system
author cin
date Mon, 05 May 2014 07:35:48 +0400
parents d9d794b61bb9
children 790e8a997d30
comparison
equal deleted inserted replaced
51:2c332a9c64c0 52:edf0bc558596
114 /// <summary> 114 /// <summary>
115 /// Создает постоянную копию текущего контекста, данную копию можно хранить и использовать для передачи через <see cref="Fork(TraceContext)"/> 115 /// Создает постоянную копию текущего контекста, данную копию можно хранить и использовать для передачи через <see cref="Fork(TraceContext)"/>
116 /// </summary> 116 /// </summary>
117 /// <returns>Копия текущего контекста трассировки.</returns> 117 /// <returns>Копия текущего контекста трассировки.</returns>
118 public static TraceContext Snapshot() { 118 public static TraceContext Snapshot() {
119 return _current == null ? new TraceContext() : new TraceContext(_current); 119 return _current == null ? new TraceContext() : new TraceContext(_current,false);
120 } 120 }
121 121
122 /// <summary> 122 /// <summary>
123 /// Выполняет переданное действие в указанном контексте трассировки, по окончании восстанавливает предыдущий контекст трассировки потока. 123 /// Выполняет переданное действие в указанном контексте трассировки, по окончании восстанавливает предыдущий контекст трассировки потока.
124 /// </summary> 124 /// </summary>
129 var old = _current; 129 var old = _current;
130 Fork(this); 130 Fork(this);
131 try { 131 try {
132 action(); 132 action();
133 } finally { 133 } finally {
134 _current.EndAllOperations(); 134 if(_current != null)
135 _current.EndAllOperations();
135 _current = old; 136 _current = old;
136 } 137 }
137 } 138 }
138 139
139 /// <summary> 140 /// <summary>
195 m_currentOperation = m_currentOperation.Parent; 196 m_currentOperation = m_currentOperation.Parent;
196 } 197 }
197 } 198 }
198 199
199 /// <summary> 200 /// <summary>
201 /// Создает копию контекста и возвращается на предыдущую операцию в текущем контексте, это позволяет начать операцию в одном потоке, а завершить - в другом.
202 /// </summary>
203 /// <returns>Контекст трассировки, который можно присоединить к другому потоку.</returns>
204 public TraceContext DetachLogicalOperation() {
205 if (m_bound == m_currentOperation) {
206 return new TraceContext();
207 } else {
208 var detached = new TraceContext(this, true);
209 m_currentOperation = m_currentOperation.Parent;
210 return detached;
211 }
212 }
213
214 public void BindLogicalOperationToPromise(IPromiseBase promise) {
215 Safe.ArgumentNotNull(promise, "promise");
216
217 var ctx = DetachLogicalOperation();
218 promise.Finally(() => {
219 var old = _current;
220 TraceContext.Attach(ctx);
221 TraceContext.Current.EndLogicalOperation();
222 _current = old;
223 });
224 }
225
226 /// <summary>
200 /// Заврешает все начатые в этом контексте операции 227 /// Заврешает все начатые в этом контексте операции
201 /// </summary> 228 /// </summary>
202 public void EndAllOperations() { 229 public void EndAllOperations() {
203 while (m_bound != m_currentOperation) 230 while (m_bound != m_currentOperation)
204 EndLogicalOperation(); 231 EndLogicalOperation();