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

◆ AcquireWriterLock() [1/2]

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

Definition at line 298 of file ReaderWriterLock.cs.

299 {
300 if (millisecondsTimeout < -1)
301 {
302 throw GetInvalidTimeoutException("millisecondsTimeout");
303 }
305 if (Interlocked.CompareExchange(ref _state, 4096, 0) != 0)
306 {
308 {
309 if (_writerLevel == ushort.MaxValue)
310 {
311 throw new OverflowException(System.SR.Overflow_UInt16);
312 }
313 _writerLevel++;
314 return;
315 }
316 int num = 0;
317 int num2 = _state;
318 do
319 {
320 int num3 = num2;
321 if (num3 == 0 || num3 == 3072)
322 {
323 num2 = Interlocked.CompareExchange(ref _state, num3 + 4096, num3);
324 if (num2 == num3)
325 {
326 break;
327 }
328 continue;
329 }
330 if ((num3 & -8388608) == -8388608)
331 {
332 Thread.Sleep(1000);
333 num = 0;
334 num2 = _state;
335 continue;
336 }
337 num++;
338 if ((num3 & 0xC00) == 3072)
339 {
340 if (num > DefaultSpinCount)
341 {
342 Thread.Sleep(1);
343 num = 0;
344 }
345 num2 = _state;
346 continue;
347 }
348 if (num <= DefaultSpinCount)
349 {
350 num2 = _state;
351 continue;
352 }
353 num2 = Interlocked.CompareExchange(ref _state, num3 + 8388608, num3);
354 if (num2 != num3)
355 {
356 continue;
357 }
358 int num4 = -8388608;
359 AutoResetEvent autoResetEvent = null;
360 bool flag = false;
361 try
362 {
364 flag = autoResetEvent.WaitOne(millisecondsTimeout);
365 if (flag)
366 {
367 num4 += 2048;
368 }
369 }
370 finally
371 {
372 num3 = Interlocked.Add(ref _state, num4) - num4;
373 if (!flag && ((uint)num3 & 0x800u) != 0 && (num3 & -8388608) == 8388608)
374 {
375 if (autoResetEvent == null)
376 {
378 }
379 while (true)
380 {
381 num3 = _state;
382 if (((uint)num3 & 0x800u) != 0 && (num3 & -8388608) == 0)
383 {
384 if (autoResetEvent.WaitOne(10))
385 {
386 num4 = 2048;
387 num3 = Interlocked.Add(ref _state, num4) - num4;
389 _writerLevel = 1;
391 break;
392 }
393 continue;
394 }
395 break;
396 }
397 }
398 }
399 if (flag)
400 {
401 break;
402 }
403 throw GetTimeoutException();
404 }
405 while (YieldProcessor());
406 }
408 _writerLevel = 1;
410 }
static string Overflow_UInt16
Definition SR.cs:1786
Definition SR.cs:7
static ApplicationException GetTimeoutException()
static ArgumentOutOfRangeException GetInvalidTimeoutException(string parameterName)

References System.Threading.ReaderWriterLock._state, System.Threading.ReaderWriterLock._writerEvent, System.Threading.ReaderWriterLock._writerID, System.Threading.ReaderWriterLock._writerLevel, System.Threading.ReaderWriterLock._writerSeqNum, 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.GetOrCreateWriterEvent(), System.Threading.ReaderWriterLock.GetTimeoutException(), System.millisecondsTimeout, System.SR.Overflow_UInt16, System.Threading.ReaderWriterLock.ReleaseWriterLock(), System.Threading.Thread.Sleep(), and System.Threading.ReaderWriterLock.YieldProcessor().

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