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

◆ TryEnterUpgradeableReadLockCore()

bool System.Threading.ReaderWriterLockSlim.TryEnterUpgradeableReadLockCore ( TimeoutTracker timeout)
inlineprivate

Definition at line 744 of file ReaderWriterLockSlim.cs.

745 {
746 if (_fDisposed)
747 {
748 throw new ObjectDisposedException(null);
749 }
750 int currentManagedThreadId = Environment.CurrentManagedThreadId;
751 ReaderWriterCount threadRWCount;
752 if (!_fIsReentrant)
753 {
754 if (currentManagedThreadId == _upgradeLockOwnerId)
755 {
756 throw new LockRecursionException(SR.LockRecursionException_RecursiveUpgradeNotAllowed);
757 }
758 if (currentManagedThreadId == _writeLockOwnerId)
759 {
760 throw new LockRecursionException(SR.LockRecursionException_UpgradeAfterWriteNotAllowed);
761 }
762 _spinLock.Enter(EnterSpinLockReason.EnterAnyRead);
763 threadRWCount = GetThreadRWCount(dontAllocate: true);
764 if (threadRWCount != null && threadRWCount.readercount > 0)
765 {
766 _spinLock.Exit();
767 throw new LockRecursionException(SR.LockRecursionException_UpgradeAfterReadNotAllowed);
768 }
769 }
770 else
771 {
772 _spinLock.Enter(EnterSpinLockReason.EnterAnyRead);
773 threadRWCount = GetThreadRWCount(dontAllocate: false);
774 if (currentManagedThreadId == _upgradeLockOwnerId)
775 {
776 threadRWCount.upgradecount++;
777 _spinLock.Exit();
778 return true;
779 }
780 if (currentManagedThreadId == _writeLockOwnerId)
781 {
782 _owners++;
783 _upgradeLockOwnerId = currentManagedThreadId;
784 threadRWCount.upgradecount++;
785 if (threadRWCount.readercount > 0)
786 {
788 }
789 _spinLock.Exit();
790 return true;
791 }
792 if (threadRWCount.readercount > 0)
793 {
794 _spinLock.Exit();
795 throw new LockRecursionException(SR.LockRecursionException_UpgradeAfterReadNotAllowed);
796 }
797 }
798 bool flag = true;
799 int num = 0;
800 while (true)
801 {
802 if (_upgradeLockOwnerId == -1 && _owners < 268435454)
803 {
804 _owners++;
805 _upgradeLockOwnerId = currentManagedThreadId;
806 if (_fIsReentrant)
807 {
808 if (IsRwHashEntryChanged(threadRWCount))
809 {
810 threadRWCount = GetThreadRWCount(dontAllocate: false);
811 }
812 threadRWCount.upgradecount++;
813 }
814 break;
815 }
816 if (timeout.IsExpired)
817 {
818 _spinLock.Exit();
819 return false;
820 }
821 if (num < 20 && ShouldSpinForEnterAnyRead())
822 {
823 _spinLock.Exit();
824 num++;
825 SpinWait(num);
826 _spinLock.Enter(EnterSpinLockReason.EnterAnyRead);
827 }
828 else if (_upgradeEvent == null)
829 {
830 LazyCreateEvent(ref _upgradeEvent, EnterLockType.UpgradeableRead);
831 }
832 else if (!WaitOnEvent(_upgradeEvent, ref _numUpgradeWaiters, timeout, EnterLockType.UpgradeableRead))
833 {
834 return false;
835 }
836 }
837 _spinLock.Exit();
838 return true;
839 }
void LazyCreateEvent([NotNull] ref EventWaitHandle waitEvent, EnterLockType enterLockType)
ReaderWriterCount GetThreadRWCount(bool dontAllocate)
bool WaitOnEvent(EventWaitHandle waitEvent, ref uint numWaiters, TimeoutTracker timeout, EnterLockType enterLockType)
bool IsRwHashEntryChanged(ReaderWriterCount lrwc)

References System.Threading.ReaderWriterLockSlim._fDisposed, System.Threading.ReaderWriterLockSlim._fIsReentrant, System.Threading.ReaderWriterLockSlim._fUpgradeThreadHoldingRead, System.Threading.ReaderWriterLockSlim._numUpgradeWaiters, System.Threading.ReaderWriterLockSlim._owners, System.Threading.ReaderWriterLockSlim._spinLock, System.Threading.ReaderWriterLockSlim._upgradeEvent, System.Threading.ReaderWriterLockSlim._upgradeLockOwnerId, System.Threading.ReaderWriterLockSlim._writeLockOwnerId, System.Environment.CurrentManagedThreadId, System.Threading.ReaderWriterLockSlim.SpinLock.Enter(), System.Threading.ReaderWriterLockSlim.SpinLock.Exit(), System.Threading.ReaderWriterLockSlim.GetThreadRWCount(), System.Threading.ReaderWriterLockSlim.IsRwHashEntryChanged(), System.Threading.ReaderWriterLockSlim.LazyCreateEvent(), System.SR.LockRecursionException_RecursiveUpgradeNotAllowed, System.SR.LockRecursionException_UpgradeAfterReadNotAllowed, System.SR.LockRecursionException_UpgradeAfterWriteNotAllowed, System.Threading.ReaderWriterCount.readercount, System.Threading.ReaderWriterLockSlim.ShouldSpinForEnterAnyRead(), System.Threading.ReaderWriterLockSlim.SpinWait(), System.timeout, System.Threading.ReaderWriterCount.upgradecount, and System.Threading.ReaderWriterLockSlim.WaitOnEvent().

Referenced by System.Threading.ReaderWriterLockSlim.TryEnterUpgradeableReadLock().