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