Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
TransactionTable.cs
Go to the documentation of this file.
2
3namespace System.Transactions;
4
5internal sealed class TransactionTable
6{
7 private readonly Timer _timer;
8
9 private bool _timerEnabled;
10
11 private readonly int _timerInterval;
12
13 private long _ticks;
14
15 private long _lastTimerTime;
16
17 private readonly BucketSet _headBucketSet;
18
20
21 private long CurrentTime
22 {
23 get
24 {
25 if (_timerEnabled)
26 {
27 return _lastTimerTime;
28 }
29 return DateTime.UtcNow.Ticks;
30 }
31 }
32
34 {
35 _timer = new Timer(ThreadTimer, null, -1, _timerInterval);
36 _timerEnabled = false;
37 _timerInterval = 512;
38 _ticks = 0L;
39 _headBucketSet = new BucketSet(this, long.MaxValue);
41 }
42
44 {
45 if (timeout != TimeSpan.Zero)
46 {
47 long num = (timeout.Ticks / 10000 >> 9) + _ticks;
48 return num + 2;
49 }
50 return long.MaxValue;
51 }
52
57
58 internal int Add(InternalTransaction txNew)
59 {
60 int num = 0;
61 num = _rwLock.EnterReadLock();
62 try
63 {
64 if (txNew.AbsoluteTimeout != long.MaxValue && !_timerEnabled)
65 {
67 {
69 }
71 _timerEnabled = true;
72 }
73 txNew.CreationTime = CurrentTime;
74 AddIter(txNew);
75 return num;
76 }
77 finally
78 {
80 }
81 }
82
83 private void AddIter(InternalTransaction txNew)
84 {
85 BucketSet bucketSet = _headBucketSet;
86 while (bucketSet.AbsoluteTimeout != txNew.AbsoluteTimeout)
87 {
88 BucketSet bucketSet2 = null;
89 do
90 {
91 WeakReference weakReference = (WeakReference)bucketSet.nextSetWeak;
92 BucketSet bucketSet3 = null;
93 if (weakReference != null)
94 {
95 bucketSet3 = (BucketSet)weakReference.Target;
96 }
97 if (bucketSet3 == null)
98 {
99 BucketSet bucketSet4 = new BucketSet(this, txNew.AbsoluteTimeout);
100 WeakReference value = new WeakReference(bucketSet4);
101 WeakReference weakReference2 = (WeakReference)Interlocked.CompareExchange(ref bucketSet.nextSetWeak, value, weakReference);
102 if (weakReference2 == weakReference)
103 {
104 bucketSet4.prevSet = bucketSet;
105 }
106 }
107 else
108 {
109 bucketSet2 = bucketSet;
110 bucketSet = bucketSet3;
111 }
112 }
113 while (bucketSet.AbsoluteTimeout > txNew.AbsoluteTimeout);
114 if (bucketSet.AbsoluteTimeout == txNew.AbsoluteTimeout)
115 {
116 continue;
117 }
118 BucketSet bucketSet5 = new BucketSet(this, txNew.AbsoluteTimeout);
119 WeakReference value2 = new WeakReference(bucketSet5);
120 bucketSet5.nextSetWeak = bucketSet2.nextSetWeak;
121 WeakReference weakReference3 = (WeakReference)Interlocked.CompareExchange(ref bucketSet2.nextSetWeak, value2, bucketSet5.nextSetWeak);
122 if (weakReference3 == bucketSet5.nextSetWeak)
123 {
124 if (weakReference3 != null)
125 {
126 BucketSet bucketSet6 = (BucketSet)weakReference3.Target;
127 if (bucketSet6 != null)
128 {
129 bucketSet6.prevSet = bucketSet5;
130 }
131 }
132 bucketSet5.prevSet = bucketSet2;
133 }
134 bucketSet = bucketSet2;
135 bucketSet2 = null;
136 }
137 bucketSet.Add(txNew);
138 }
139
140 internal void Remove(InternalTransaction tx)
141 {
142 tx._tableBucket.Remove(tx);
143 tx._tableBucket = null;
144 }
145
146 private void ThreadTimer(object state)
147 {
148 if (!_timerEnabled)
149 {
150 return;
151 }
152 _ticks++;
154 BucketSet bucketSet = null;
155 BucketSet bucketSet2 = _headBucketSet;
156 WeakReference weakReference = null;
157 BucketSet bucketSet3 = null;
158 weakReference = (WeakReference)bucketSet2.nextSetWeak;
159 if (weakReference != null)
160 {
161 bucketSet3 = (BucketSet)weakReference.Target;
162 }
163 if (bucketSet3 == null)
164 {
166 try
167 {
168 weakReference = (WeakReference)bucketSet2.nextSetWeak;
169 if (weakReference != null)
170 {
171 bucketSet3 = (BucketSet)weakReference.Target;
172 }
173 if (bucketSet3 == null)
174 {
175 if (!_timer.Change(-1, -1))
176 {
178 }
179 _timerEnabled = false;
180 return;
181 }
182 }
183 finally
184 {
186 }
187 }
188 WeakReference weakReference2;
189 while (true)
190 {
191 weakReference = (WeakReference)bucketSet2.nextSetWeak;
192 if (weakReference == null)
193 {
194 return;
195 }
196 bucketSet3 = (BucketSet)weakReference.Target;
197 if (bucketSet3 == null)
198 {
199 return;
200 }
201 bucketSet = bucketSet2;
202 bucketSet2 = bucketSet3;
203 if (bucketSet2.AbsoluteTimeout <= _ticks)
204 {
205 weakReference2 = (WeakReference)Interlocked.CompareExchange(ref bucketSet.nextSetWeak, null, weakReference);
206 if (weakReference2 == weakReference)
207 {
208 break;
209 }
210 bucketSet2 = bucketSet;
211 }
212 }
213 BucketSet bucketSet4 = null;
214 do
215 {
216 bucketSet4 = ((weakReference2 == null) ? null : ((BucketSet)weakReference2.Target));
217 if (bucketSet4 != null)
218 {
219 bucketSet4.TimeoutTransactions();
220 weakReference2 = (WeakReference)bucketSet4.nextSetWeak;
221 }
222 }
223 while (bucketSet4 != null);
224 }
225}
static string UnexpectedTimerFailure
Definition SR.cs:74
Definition SR.cs:7
static int CompareExchange(ref int location1, int value, int comparand)
bool Change(int dueTime, int period)
Definition Timer.cs:131
void Add(InternalTransaction newTx)
Definition BucketSet.cs:24
void Remove(InternalTransaction tx)
Definition Bucket.cs:58
static Exception CreateInvalidOperationException(TraceSourceType traceSource, string message, Exception innerException)
void AddIter(InternalTransaction txNew)
TimeSpan RecalcTimeout(InternalTransaction tx)
int Add(InternalTransaction txNew)
readonly CheapUnfairReaderWriterLock _rwLock
void Remove(InternalTransaction tx)
virtual ? object Target
static unsafe DateTime UtcNow
Definition DateTime.cs:142
static TimeSpan FromMilliseconds(double value)
Definition TimeSpan.cs:228
static readonly TimeSpan Zero
Definition TimeSpan.cs:21