comparison Implab/Diagnostics/OperationContext.cs @ 192:f1da3afc3521 release v2.1

Слияние с v2
author cin
date Fri, 22 Apr 2016 13:10:34 +0300
parents 04d4c92d0f28
children ea485487a424
comparison
equal deleted inserted replaced
71:1714fd8678ef 192:f1da3afc3521
1 namespace Implab.Diagnostics {
2 struct OperationContext {
3 public readonly static OperationContext EMPTY = new OperationContext(LogicalOperation.EMPTY, false);
4
5 LogicalOperation m_initial;
6 LogicalOperation m_current;
7 bool m_ownership;
8
9 public OperationContext(LogicalOperation operation, bool ownership) {
10 Safe.ArgumentNotNull(operation, "operation");
11
12 m_initial = operation;
13 m_current = operation;
14 m_ownership = ownership;
15 }
16
17 public LogicalOperation CurrentOperation {
18 get { return m_current; }
19 }
20
21 public void BeginLogicalOperation(string name) {
22 m_current = new LogicalOperation(name, m_current);
23 }
24
25 public LogicalOperation DetachLogicalOperation() {
26 var detached = m_current;
27 if (m_current != LogicalOperation.EMPTY) {
28 if (m_current != m_initial)
29 m_current = m_current.Parent;
30 else if (m_ownership)
31 m_current = LogicalOperation.EMPTY;
32 else {
33 TraceLog.TraceWarning("DetachLogicalOperation can't be applied in the current context");
34 detached = LogicalOperation.EMPTY;
35 }
36 } else {
37 TraceLog.TraceWarning("DetachLogicalOperation can't be applied in the current context");
38 }
39
40 return detached;
41 }
42
43 public LogicalOperation EndLogicalOperation() {
44 var current = m_current;
45 if (m_current != LogicalOperation.EMPTY && (m_current != m_initial || m_ownership)) {
46 m_current = m_current.Parent;
47 if (current == m_initial) {
48 // we have complete the owned operation
49 m_initial = m_current;
50 m_ownership = false;
51 }
52 } else {
53 TraceLog.TraceWarning("EndLogicalOperation can't be applied in the current context");
54 }
55 return current;
56 }
57
58 public void Leave() {
59
60 if ((m_ownership && m_current != LogicalOperation.EMPTY) || (!m_ownership && m_current != m_initial) )
61 TraceLog.TraceWarning("Trying to leave unfinished logical operation {0}", m_current.Name);
62 }
63 }
64 }
65