Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ AcquireReaderLock() [1/2]

void System.Threading.ReaderWriterLock.AcquireReaderLock ( int millisecondsTimeout)
inline

Definition at line 178 of file ReaderWriterLock.cs.

179 {
180 if (millisecondsTimeout < -1)
181 {
182 throw GetInvalidTimeoutException("millisecondsTimeout");
183 }
184 ThreadLocalLockEntry orCreateCurrent = ThreadLocalLockEntry.GetOrCreateCurrent(_lockID);
185 if (Interlocked.CompareExchange(ref _state, 1, 0) != 0)
186 {
187 if (orCreateCurrent._readerLevel > 0)
188 {
189 if (orCreateCurrent._readerLevel == ushort.MaxValue)
190 {
191 throw new OverflowException(System.SR.Overflow_UInt16);
192 }
193 orCreateCurrent._readerLevel++;
194 return;
195 }
197 {
199 return;
200 }
201 int num = 0;
202 int num2 = _state;
203 do
204 {
205 int num3 = num2;
206 if (num3 < 1023 || (((uint)num3 & 0x400u) != 0 && (num3 & 0x1000) == 0 && (num3 & 0x3FF) + ((num3 & 0x7FE000) >> 13) <= 1021))
207 {
208 num2 = Interlocked.CompareExchange(ref _state, num3 + 1, num3);
209 if (num2 == num3)
210 {
211 break;
212 }
213 continue;
214 }
215 if ((num3 & 0x3FF) == 1023 || (num3 & 0x7FE000) == 8380416 || (num3 & 0xC00) == 1024)
216 {
217 int millisecondsTimeout2 = 100;
218 if ((num3 & 0x3FF) == 1023 || (num3 & 0x7FE000) == 8380416)
219 {
221 }
223 num = 0;
224 num2 = _state;
225 continue;
226 }
227 num++;
228 if ((num3 & 0xC00) == 3072)
229 {
230 if (num > DefaultSpinCount)
231 {
232 Thread.Sleep(1);
233 num = 0;
234 }
235 num2 = _state;
236 continue;
237 }
238 if (num <= DefaultSpinCount)
239 {
240 num2 = _state;
241 continue;
242 }
243 num2 = Interlocked.CompareExchange(ref _state, num3 + 8192, num3);
244 if (num2 != num3)
245 {
246 continue;
247 }
248 int num4 = -8192;
249 ManualResetEventSlim manualResetEventSlim = null;
250 bool flag = false;
251 try
252 {
255 if (flag)
256 {
257 num4++;
258 }
259 }
260 finally
261 {
262 num3 = Interlocked.Add(ref _state, num4) - num4;
263 if (!flag && ((uint)num3 & 0x400u) != 0 && (num3 & 0x7FE000) == 8192)
264 {
265 if (manualResetEventSlim == null)
266 {
268 }
270 manualResetEventSlim.Reset();
271 Interlocked.Add(ref _state, -1023);
272 orCreateCurrent._readerLevel++;
274 }
275 }
276 if (!flag)
277 {
278 throw GetTimeoutException();
279 }
280 if ((num3 & 0x7FE000) == 8192)
281 {
282 manualResetEventSlim.Reset();
283 Interlocked.Add(ref _state, -1024);
284 }
285 break;
286 }
287 while (YieldProcessor());
288 }
289 orCreateCurrent._readerLevel++;
290 }
static string Overflow_UInt16
Definition SR.cs:1786
Definition SR.cs:7
static ApplicationException GetTimeoutException()
void AcquireWriterLock(int millisecondsTimeout)
static ArgumentOutOfRangeException GetInvalidTimeoutException(string parameterName)
ManualResetEventSlim GetOrCreateReaderEvent()

References System.Threading.ReaderWriterLock._lockID, System.Threading.ReaderWriterLock._readerEvent, System.Threading.ReaderWriterLock._state, System.Threading.ReaderWriterLock._writerID, System.Threading.ReaderWriterLock.AcquireWriterLock(), System.Threading.Interlocked.Add(), System.Threading.Interlocked.CompareExchange(), System.Threading.ReaderWriterLock.DefaultSpinCount, System.Runtime.Serialization.Dictionary, System.Threading.ReaderWriterLock.GetCurrentThreadID(), System.Threading.ReaderWriterLock.GetInvalidTimeoutException(), System.Threading.ReaderWriterLock.ThreadLocalLockEntry.GetOrCreateCurrent(), System.Threading.ReaderWriterLock.GetOrCreateReaderEvent(), System.Threading.ReaderWriterLock.GetTimeoutException(), System.millisecondsTimeout, System.SR.Overflow_UInt16, System.Threading.ReaderWriterLock.ReleaseReaderLock(), System.Threading.Thread.Sleep(), System.Threading.ManualResetEventSlim.Wait(), and System.Threading.ReaderWriterLock.YieldProcessor().

Referenced by System.Threading.ReaderWriterLock.AcquireReaderLock(), and System.Threading.ReaderWriterLock.RecoverLock().