22 int num = Environment.TickCount -
_start;
23 if (num < 0 || num >=
_total)
35 long num = (long)
timeout.TotalMilliseconds;
36 if (num < -1 || num >
int.MaxValue)
83 EnterSpinLockReason.EnterAnyRead => 0,
84 EnterSpinLockReason.ExitAnyRead => 1,
85 EnterSpinLockReason.EnterWrite => 65536,
119 if (enterDeprioritizationStateChange != 0)
127 if (num < 10 && processorCount > 1)
153 if (enterDeprioritizationStateChange != 0)
307 return numReaders - 1;
319 if (threadRWCount !=
null)
335 if (threadRWCount !=
null)
357 if (threadRWCount !=
null)
429 if (!dontAllocate && readerWriterCount ==
null &&
IsRWEntryEmpty(next))
431 readerWriterCount = next;
439 if (readerWriterCount ==
null)
442 readerWriterCount.next =
t_rwc;
443 t_rwc = readerWriterCount;
445 readerWriterCount.lockID =
_lockID;
446 return readerWriterCount;
622 if (threadRWCount !=
null && threadRWCount.
readercount > 0)
666 if (numReaders == 2 && threadRWCount !=
null)
764 if (threadRWCount !=
null && threadRWCount.
readercount > 0)
845 if (threadRWCount ==
null || threadRWCount.
readercount < 1)
882 if (threadRWCount ==
null)
918 if (threadRWCount ==
null)
946 switch (enterLockType)
960 if (waitEvent ==
null)
962 waitEvent = eventWaitHandle;
974 switch (enterLockType)
977 waiterStates =
WaiterStates.UpgradeableReadWaiterSignaled;
990 if (waiterStates != 0 && (
_waiterStates & waiterStates) != 0)
1015 if (flag && waiterStates != 0 && (
_waiterStates & waiterStates) != 0)
1123 return (
_owners & 0xBFFFFFFFu) == 0;
1176 if (!isUpgradeToWrite)
1185 if (spinCount < 5 && Environment.ProcessorCount > 1)
static int ProcessorCount
static int CurrentManagedThreadId
static string SynchronizationLockException_IncorrectDispose
static string SynchronizationLockException_MisMatchedUpgrade
static string LockRecursionException_WriteAfterReadNotAllowed
static string SynchronizationLockException_MisMatchedWrite
static string LockRecursionException_UpgradeAfterReadNotAllowed
static string LockRecursionException_ReadAfterWriteNotAllowed
static string LockRecursionException_RecursiveReadNotAllowed
static string LockRecursionException_RecursiveWriteNotAllowed
static string LockRecursionException_RecursiveUpgradeNotAllowed
static string SynchronizationLockException_MisMatchedRead
static string LockRecursionException_UpgradeAfterWriteNotAllowed
static int CompareExchange(ref int location1, int value, int comparand)
static int Add(ref int location1, int value)
static int Increment(ref int location)
void Dispose(bool disposing)
bool _fUpgradeThreadHoldingRead
EventWaitHandle _waitUpgradeEvent
static bool IsRWEntryEmpty(ReaderWriterCount rwc)
bool TryEnterUpgradeableReadLock(TimeSpan timeout)
void LazyCreateEvent([NotNull] ref EventWaitHandle waitEvent, EnterLockType enterLockType)
bool TryEnterReadLock(int millisecondsTimeout)
bool TryEnterWriteLockCore(TimeoutTracker timeout)
void ExitAndWakeUpAppropriateReadWaiters()
readonly bool _fIsReentrant
void SetUpgraderWaiting()
void EnterUpgradeableReadLock()
bool TryEnterWriteLock(TimeoutTracker timeout)
int RecursiveUpgradeCount
LockRecursionPolicy RecursionPolicy
void ExitAndWakeUpAppropriateWaitersPreferringWriters()
EventWaitHandle _upgradeEvent
ReaderWriterCount GetThreadRWCount(bool dontAllocate)
static ReaderWriterCount t_rwc
void ExitAndWakeUpAppropriateWaiters()
bool TryEnterReadLock(TimeSpan timeout)
bool TryEnterUpgradeableReadLock(TimeoutTracker timeout)
bool TryEnterReadLock(TimeoutTracker timeout)
bool ShouldSpinForEnterAnyWrite(bool isUpgradeToWrite)
bool TryEnterWriteLock(TimeSpan timeout)
bool TryEnterWriteLock(int millisecondsTimeout)
bool TryEnterUpgradeableReadLock(int millisecondsTimeout)
@ UpgradeableReadWaiterSignaled
static void SpinWait(int spinCount)
void ExitUpgradeableReadLock()
void ClearWritersWaiting()
EventWaitHandle _writeEvent
uint _numWriteUpgradeWaiters
bool WaitOnEvent(EventWaitHandle waitEvent, ref uint numWaiters, TimeoutTracker timeout, EnterLockType enterLockType)
ReaderWriterLockSlim(LockRecursionPolicy recursionPolicy)
bool ShouldSpinForEnterAnyRead()
bool IsUpgradeableReadLockHeld
void InitializeThreadCounts()
void ClearWriterAcquired()
bool TryEnterReadLockCore(TimeoutTracker timeout)
bool IsRwHashEntryChanged(ReaderWriterCount lrwc)
WaiterStates _waiterStates
void ClearUpgraderWaiting()
bool TryEnterUpgradeableReadLockCore(TimeoutTracker timeout)
EventWaitHandle _readEvent
static void Sleep(int millisecondsTimeout)
static void SpinWait(int iterations)
static void Write(ref bool location, bool value)
virtual void Dispose(bool explicitDisposing)
virtual bool WaitOne(int millisecondsTimeout)
static int GetEnterDeprioritizationStateChange(EnterSpinLockReason reason)
void EnterSpin(EnterSpinLockReason reason)
ushort EnterForEnterAnyWriteDeprioritizedCount
bool IsEnterDeprioritized(EnterSpinLockReason reason)
ushort EnterForEnterAnyReadDeprioritizedCount
void Enter(EnterSpinLockReason reason)
int _enterDeprioritizationState
int RemainingMilliseconds
TimeoutTracker(TimeSpan timeout)
TimeoutTracker(int millisecondsTimeout)