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

◆ WaitOnEvent()

bool System.Threading.ReaderWriterLockSlim.WaitOnEvent ( EventWaitHandle waitEvent,
ref uint numWaiters,
TimeoutTracker timeout,
EnterLockType enterLockType )
inlineprivate

Definition at line 970 of file ReaderWriterLockSlim.cs.

971 {
972 WaiterStates waiterStates = WaiterStates.None;
973 EnterSpinLockReason reason;
974 switch (enterLockType)
975 {
976 case EnterLockType.UpgradeableRead:
977 waiterStates = WaiterStates.UpgradeableReadWaiterSignaled;
978 goto case EnterLockType.Read;
979 case EnterLockType.Read:
980 reason = EnterSpinLockReason.EnterAnyRead;
981 break;
982 case EnterLockType.Write:
983 waiterStates = WaiterStates.WriteWaiterSignaled;
984 reason = EnterSpinLockReason.EnterWrite;
985 break;
986 default:
987 reason = EnterSpinLockReason.UpgradeToWrite;
988 break;
989 }
990 if (waiterStates != 0 && (_waiterStates & waiterStates) != 0)
991 {
992 _waiterStates &= (WaiterStates)(byte)(~(int)waiterStates);
993 }
994 waitEvent.Reset();
995 numWaiters++;
996 HasNoWaiters = false;
997 if (_numWriteWaiters == 1)
998 {
1000 }
1001 if (_numWriteUpgradeWaiters == 1)
1002 {
1004 }
1005 bool flag = false;
1006 _spinLock.Exit();
1007 try
1008 {
1009 flag = waitEvent.WaitOne(timeout.RemainingMilliseconds);
1010 }
1011 finally
1012 {
1013 _spinLock.Enter(reason);
1014 numWaiters--;
1015 if (flag && waiterStates != 0 && (_waiterStates & waiterStates) != 0)
1016 {
1017 _waiterStates &= (WaiterStates)(byte)(~(int)waiterStates);
1018 }
1020 {
1021 HasNoWaiters = true;
1022 }
1023 if (_numWriteWaiters == 0)
1024 {
1026 }
1027 if (_numWriteUpgradeWaiters == 0)
1028 {
1030 }
1031 if (!flag)
1032 {
1033 if (enterLockType >= EnterLockType.Write)
1034 {
1036 }
1037 else
1038 {
1039 _spinLock.Exit();
1040 }
1041 }
1042 }
1043 return flag;
1044 }

References System.Threading.ReaderWriterLockSlim._numReadWaiters, System.Threading.ReaderWriterLockSlim._numUpgradeWaiters, System.Threading.ReaderWriterLockSlim._numWriteUpgradeWaiters, System.Threading.ReaderWriterLockSlim._numWriteWaiters, System.Threading.ReaderWriterLockSlim._spinLock, System.Threading.ReaderWriterLockSlim._waiterStates, System.Threading.ReaderWriterLockSlim.ClearUpgraderWaiting(), System.Threading.ReaderWriterLockSlim.ClearWritersWaiting(), System.Threading.ReaderWriterLockSlim.SpinLock.Enter(), System.Threading.ReaderWriterLockSlim.SpinLock.Exit(), System.Threading.ReaderWriterLockSlim.ExitAndWakeUpAppropriateReadWaiters(), System.Threading.ReaderWriterLockSlim.HasNoWaiters, System.Threading.EventWaitHandle.Reset(), System.Threading.ReaderWriterLockSlim.SetUpgraderWaiting(), System.Threading.ReaderWriterLockSlim.SetWritersWaiting(), System.timeout, and System.Threading.WaitHandle.WaitOne().

Referenced by System.Threading.ReaderWriterLockSlim.TryEnterReadLockCore(), System.Threading.ReaderWriterLockSlim.TryEnterUpgradeableReadLockCore(), and System.Threading.ReaderWriterLockSlim.TryEnterWriteLockCore().