File: VolatileResourceManager.cs

package info (click to toggle)
mono 6.12.0.199%2Bdfsg-6
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 1,296,836 kB
  • sloc: cs: 11,181,803; xml: 2,850,076; ansic: 699,709; cpp: 123,344; perl: 59,361; javascript: 30,841; asm: 21,853; makefile: 20,405; sh: 15,009; python: 4,839; pascal: 925; sql: 859; sed: 16; php: 1
file content (108 lines) | stat: -rw-r--r-- 2,845 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#pragma warning disable 1634, 1691
using System;
using System.Diagnostics;
using System.Transactions;
using System.Collections;
using System.Collections.Generic;
using System.Workflow.Runtime.Hosting;

namespace System.Workflow.Runtime
{
    /// <summary>
    /// Volatile Resource Manager
    /// </summary>    
    internal sealed class VolatileResourceManager
    {
        // members
        private WorkBatchCollection _workCollection = new WorkBatchCollection();
        private WorkBatch _mergedBatch = null;

        // constructor
        internal VolatileResourceManager()
        {
        }

        // properties
        internal WorkBatchCollection BatchCollection
        {
            get
            {
                return _workCollection;
            }
        }

        internal bool IsBatchDirty
        {
            get
            {
                IDictionaryEnumerator de = _workCollection.GetEnumerator();
                while (de.MoveNext())
                {
                    WorkBatch batch = (WorkBatch)de.Value;
                    if (batch.IsDirty)
                        return true;
                }
                return false;
            }
        }

        WorkBatch GetMergedBatch()
        {
            return this._workCollection.GetMergedBatch();
        }

        internal void Commit()
        {
            _mergedBatch = GetMergedBatch();

            Transaction transaction = Transaction.Current;
            if (null == transaction)
                throw new InvalidOperationException(ExecutionStringManager.NullAmbientTransaction);

            // Do Commit Sequence iteration over work collection
            _mergedBatch.Commit(transaction);
        }

        internal void Complete()
        {
            try
            {
                _mergedBatch.Complete(true);
            }
            finally
            {
                if (_mergedBatch != null)
                {
                    _mergedBatch.Dispose();
                    _mergedBatch = null;
                }
                if (_workCollection != null)
                {
                    _workCollection.ClearSubBatches();
                }
            }
        }

        internal void HandleFault()
        {
            //
            // We've failed, clear the merged batch
            if (_mergedBatch != null)
            {
                _mergedBatch.Dispose();
                _mergedBatch = null;
            }
            // clear transient batch which holds instance state primarily
            if (_workCollection != null)
            {
                _workCollection.ClearTransientBatch();
            }
        }

        internal void ClearAllBatchedWork()
        {
            if (_workCollection != null)
                _workCollection.RollbackAllBatchedWork();
        }
    }
}