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

◆ TryEnterWriteLockCore()

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

Definition at line 595 of file ReaderWriterLockSlim.cs.

596 {
597 if (_fDisposed)
598 {
599 throw new ObjectDisposedException(null);
600 }
601 int currentManagedThreadId = Environment.CurrentManagedThreadId;
602 bool flag = false;
603 ReaderWriterCount threadRWCount;
604 if (!_fIsReentrant)
605 {
606 if (currentManagedThreadId == _writeLockOwnerId)
607 {
608 throw new LockRecursionException(SR.LockRecursionException_RecursiveWriteNotAllowed);
609 }
610 EnterSpinLockReason reason;
611 if (currentManagedThreadId == _upgradeLockOwnerId)
612 {
613 flag = true;
614 reason = EnterSpinLockReason.UpgradeToWrite;
615 }
616 else
617 {
618 reason = EnterSpinLockReason.EnterWrite;
619 }
620 _spinLock.Enter(reason);
621 threadRWCount = GetThreadRWCount(dontAllocate: true);
622 if (threadRWCount != null && threadRWCount.readercount > 0)
623 {
624 _spinLock.Exit();
625 throw new LockRecursionException(SR.LockRecursionException_WriteAfterReadNotAllowed);
626 }
627 }
628 else
629 {
630 EnterSpinLockReason reason2 = ((currentManagedThreadId == _writeLockOwnerId) ? EnterSpinLockReason.EnterRecursiveWrite : ((currentManagedThreadId != _upgradeLockOwnerId) ? EnterSpinLockReason.EnterWrite : EnterSpinLockReason.UpgradeToWrite));
631 _spinLock.Enter(reason2);
632 threadRWCount = GetThreadRWCount(dontAllocate: false);
633 if (currentManagedThreadId == _writeLockOwnerId)
634 {
635 threadRWCount.writercount++;
636 _spinLock.Exit();
637 return true;
638 }
639 if (currentManagedThreadId == _upgradeLockOwnerId)
640 {
641 flag = true;
642 }
643 else if (threadRWCount.readercount > 0)
644 {
645 _spinLock.Exit();
646 throw new LockRecursionException(SR.LockRecursionException_WriteAfterReadNotAllowed);
647 }
648 }
649 bool flag2 = true;
650 int num = 0;
651 while (true)
652 {
653 if (IsWriterAcquired())
654 {
656 break;
657 }
658 if (flag)
659 {
660 uint numReaders = GetNumReaders();
661 if (numReaders == 1)
662 {
664 break;
665 }
666 if (numReaders == 2 && threadRWCount != null)
667 {
668 if (IsRwHashEntryChanged(threadRWCount))
669 {
670 threadRWCount = GetThreadRWCount(dontAllocate: false);
671 }
672 if (threadRWCount.readercount > 0)
673 {
675 break;
676 }
677 }
678 }
679 if (timeout.IsExpired)
680 {
681 _spinLock.Exit();
682 return false;
683 }
684 if (num < 20 && ShouldSpinForEnterAnyWrite(flag))
685 {
686 _spinLock.Exit();
687 num++;
688 SpinWait(num);
690 }
691 else if (flag)
692 {
693 if (_waitUpgradeEvent == null)
694 {
696 }
698 {
699 return false;
700 }
701 }
702 else if (_writeEvent == null)
703 {
705 }
707 {
708 return false;
709 }
710 }
711 if (_fIsReentrant)
712 {
713 if (IsRwHashEntryChanged(threadRWCount))
714 {
715 threadRWCount = GetThreadRWCount(dontAllocate: false);
716 }
717 threadRWCount.writercount++;
718 }
719 _spinLock.Exit();
720 _writeLockOwnerId = currentManagedThreadId;
721 return true;
722 }
void LazyCreateEvent([NotNull] ref EventWaitHandle waitEvent, EnterLockType enterLockType)
ReaderWriterCount GetThreadRWCount(bool dontAllocate)
bool ShouldSpinForEnterAnyWrite(bool isUpgradeToWrite)
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._numWriteUpgradeWaiters, System.Threading.ReaderWriterLockSlim._numWriteWaiters, System.Threading.ReaderWriterLockSlim._spinLock, System.Threading.ReaderWriterLockSlim._upgradeLockOwnerId, System.Threading.ReaderWriterLockSlim._waitUpgradeEvent, System.Threading.ReaderWriterLockSlim._writeEvent, System.Threading.ReaderWriterLockSlim._writeLockOwnerId, System.Environment.CurrentManagedThreadId, System.Threading.ReaderWriterLockSlim.SpinLock.Enter(), System.Threading.ReaderWriterLockSlim.SpinLock.Exit(), System.Threading.ReaderWriterLockSlim.GetNumReaders(), System.Threading.ReaderWriterLockSlim.GetThreadRWCount(), System.Threading.ReaderWriterLockSlim.IsRwHashEntryChanged(), System.Threading.ReaderWriterLockSlim.IsWriterAcquired(), System.Threading.ReaderWriterLockSlim.LazyCreateEvent(), System.SR.LockRecursionException_RecursiveWriteNotAllowed, System.SR.LockRecursionException_WriteAfterReadNotAllowed, System.Threading.ReaderWriterCount.readercount, System.Threading.ReaderWriterLockSlim.SetWriterAcquired(), System.Threading.ReaderWriterLockSlim.ShouldSpinForEnterAnyWrite(), System.Threading.ReaderWriterLockSlim.SpinWait(), System.timeout, System.Threading.ReaderWriterLockSlim.WaitOnEvent(), and System.Threading.ReaderWriterCount.writercount.

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