Mercurial > pub > ImplabNet
diff Implab/Diagnostics/OperationContext.cs @ 92:4c0e5ef99986 v2
rewritten tracing
author | cin |
---|---|
date | Wed, 22 Oct 2014 18:37:56 +0400 |
parents | |
children | dc4942d09e74 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Implab/Diagnostics/OperationContext.cs Wed Oct 22 18:37:56 2014 +0400 @@ -0,0 +1,49 @@ +namespace Implab.Diagnostics { + struct OperationContext { + readonly LogicalOperation m_initial; + public readonly static OperationContext EMPTY = new OperationContext(LogicalOperation.EMPTY, false); + LogicalOperation m_current; + readonly bool m_ownership; + + public OperationContext(LogicalOperation operation, bool ownership) { + Safe.ArgumentNotNull(operation, "operation"); + + m_initial = operation; + m_current = operation; + m_ownership = ownership; + } + + public LogicalOperation CurrentOperation { + get { return m_current; } + } + + public void BeginLogicalOperation(string name) { + m_current = new LogicalOperation(name, m_current); + } + + public LogicalOperation DetachLogicalOperation() { + var detached = m_current; + if (m_current != LogicalOperation.EMPTY) { + if (m_current != m_initial) + m_current = m_current.Parent; + else if (m_ownership) + m_current = LogicalOperation.EMPTY; + else + detached = LogicalOperation.EMPTY; + } + TraceLog.TraceWarning("EndLogicalOperation can't be applied in the current context"); + return detached; + } + + public void EndLogicalOperation() { + if (m_current != m_initial) { + m_current = m_current.Parent; + } else if (m_current != null && m_ownership) { + m_current = null; + } else { + TraceLog.TraceWarning("EndLogicalOperation can't be applied in the current context"); + } + } + } +} +