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

◆ ReleaseReaderLock()

void System.Threading.ReaderWriterLock.ReleaseReaderLock ( )
inline

Definition at line 417 of file ReaderWriterLock.cs.

418 {
420 {
422 return;
423 }
424 ThreadLocalLockEntry current = ThreadLocalLockEntry.GetCurrent(_lockID);
425 if (current == null)
426 {
427 throw GetNotOwnerException();
428 }
429 current._readerLevel--;
430 if (current._readerLevel > 0)
431 {
432 return;
433 }
434 AutoResetEvent autoResetEvent = null;
435 ManualResetEventSlim manualResetEventSlim = null;
436 int num = _state;
437 bool flag;
438 bool flag2;
439 int num2;
440 do
441 {
442 flag = false;
443 flag2 = false;
444 num2 = num;
445 int num3 = -1;
446 if ((num2 & 0x7FF) == 1)
447 {
448 flag = true;
449 if (((uint)num2 & 0xFF800000u) != 0)
450 {
452 if (autoResetEvent == null)
453 {
454 Thread.Sleep(100);
455 num = _state;
456 num2 = 0;
457 continue;
458 }
459 num3 += 2048;
460 }
461 else if (((uint)num2 & 0x7FE000u) != 0)
462 {
464 if (manualResetEventSlim == null)
465 {
466 Thread.Sleep(100);
467 num = _state;
468 num2 = 0;
469 continue;
470 }
471 num3 += 1024;
472 }
473 else if (num2 == 1 && (_readerEvent != null || _writerEvent != null))
474 {
475 flag2 = true;
476 num3 += 3072;
477 }
478 }
479 num = Interlocked.CompareExchange(ref _state, num2 + num3, num2);
480 }
481 while (num != num2);
482 if (flag)
483 {
484 if (((uint)num2 & 0xFF800000u) != 0)
485 {
486 autoResetEvent.Set();
487 }
488 else if (((uint)num2 & 0x7FE000u) != 0)
489 {
491 }
492 else if (flag2)
493 {
495 }
496 }
497 }
static ApplicationException GetNotOwnerException()
ManualResetEventSlim TryGetOrCreateReaderEvent()

References System.Threading.ReaderWriterLock._lockID, System.Threading.ReaderWriterLock._readerEvent, System.Threading.ReaderWriterLock.ThreadLocalLockEntry._readerLevel, System.Threading.ReaderWriterLock._state, System.Threading.ReaderWriterLock._writerEvent, System.Threading.ReaderWriterLock._writerID, System.Threading.Interlocked.CompareExchange(), System.Runtime.Serialization.Dictionary, System.Threading.ReaderWriterLock.ThreadLocalLockEntry.GetCurrent(), System.Threading.ReaderWriterLock.GetCurrentThreadID(), System.Threading.ReaderWriterLock.GetNotOwnerException(), System.Threading.ReaderWriterLock.ReleaseEvents(), System.Threading.ReaderWriterLock.ReleaseWriterLock(), System.Threading.Thread.Sleep(), System.Threading.ReaderWriterLock.TryGetOrCreateReaderEvent(), and System.Threading.ReaderWriterLock.TryGetOrCreateWriterEvent().

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