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

◆ DowngradeFromWriterLock()

void System.Threading.ReaderWriterLock.DowngradeFromWriterLock ( ref LockCookie lockCookie)
inline

Definition at line 628 of file ReaderWriterLock.cs.

629 {
632 {
633 throw GetNotOwnerException();
634 }
635 LockCookieFlags flags = lockCookie._flags;
636 ushort writerLevel = lockCookie._writerLevel;
637 if (((uint)flags & 0xFFF89FFFu) != 0 || lockCookie._threadID != currentThreadID || ((flags & (LockCookieFlags.OwnedNone | LockCookieFlags.OwnedWriter)) != 0 && _writerLevel <= writerLevel))
638 {
640 }
641 if ((flags & LockCookieFlags.OwnedReader) != 0)
642 {
643 ThreadLocalLockEntry orCreateCurrent = ThreadLocalLockEntry.GetOrCreateCurrent(_lockID);
644 _writerID = -1;
645 _writerLevel = 0;
646 ManualResetEventSlim manualResetEventSlim = null;
647 int num = _state;
648 int num2;
649 do
650 {
651 num2 = num;
652 int num3 = -4095;
653 if (((uint)num2 & 0x7FE000u) != 0)
654 {
656 if (manualResetEventSlim == null)
657 {
658 Thread.Sleep(100);
659 num = _state;
660 num2 = 0;
661 continue;
662 }
663 num3 += 1024;
664 }
665 num = Interlocked.CompareExchange(ref _state, num2 + num3, num2);
666 }
667 while (num != num2);
668 if (((uint)num2 & 0x7FE000u) != 0)
669 {
671 }
673 }
674 else if ((flags & (LockCookieFlags.OwnedNone | LockCookieFlags.OwnedWriter)) != 0)
675 {
676 if (writerLevel > 0)
677 {
679 }
680 else
681 {
682 if (_writerLevel != 1)
683 {
684 _writerLevel = 1;
685 }
687 }
688 }
689 lockCookie._flags = LockCookieFlags.Invalid;
690 }
static ApplicationException GetNotOwnerException()
static ApplicationException GetInvalidLockCookieException()
ManualResetEventSlim TryGetOrCreateReaderEvent()

References System.Threading.ReaderWriterLock._lockID, System.Threading.ReaderWriterLock._state, System.Threading.ReaderWriterLock._writerID, System.Threading.ReaderWriterLock._writerLevel, System.Threading.Interlocked.CompareExchange(), System.Runtime.Serialization.Dictionary, System.Threading.ReaderWriterLock.GetCurrentThreadID(), System.Threading.ReaderWriterLock.GetInvalidLockCookieException(), System.Threading.ReaderWriterLock.GetNotOwnerException(), System.Threading.ReaderWriterLock.ThreadLocalLockEntry.GetOrCreateCurrent(), System.Threading.ReaderWriterLock.ReleaseWriterLock(), System.Threading.Thread.Sleep(), and System.Threading.ReaderWriterLock.TryGetOrCreateReaderEvent().