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

◆ TryDequeue()

bool System.Collections.Concurrent.ConcurrentQueueSegment< T >.TryDequeue ( [MaybeNullWhen(false)] out T item)
inline

Definition at line 56 of file ConcurrentQueueSegment.cs.

57 {
58 Slot[] slots = _slots;
59 SpinWait spinWait = default(SpinWait);
60 while (true)
61 {
62 int num = Volatile.Read(ref _headAndTail.Head);
63 int num2 = num & _slotsMask;
64 int num3 = Volatile.Read(ref slots[num2].SequenceNumber);
65 int num4 = num3 - (num + 1);
66 if (num4 == 0)
67 {
68 if (Interlocked.CompareExchange(ref _headAndTail.Head, num + 1, num) != num)
69 {
70 continue;
71 }
72 item = slots[num2].Item;
74 {
75 if (RuntimeHelpers.IsReferenceOrContainsReferences<T>())
76 {
77 slots[num2].Item = default(T);
78 }
79 Volatile.Write(ref slots[num2].SequenceNumber, num + slots.Length);
80 }
81 return true;
82 }
83 if (num4 < 0)
84 {
85 bool frozenForEnqueues = _frozenForEnqueues;
86 int num5 = Volatile.Read(ref _headAndTail.Tail);
87 if (num5 - num <= 0 || (frozenForEnqueues && num5 - FreezeOffset - num <= 0))
88 {
89 break;
90 }
91 spinWait.SpinOnce(-1);
92 }
93 }
94 item = default(T);
95 return false;
96 }
static int CompareExchange(ref int location1, int value, int comparand)
static bool Read(ref bool location)
Definition Volatile.cs:67
static void Write(ref bool location, bool value)
Definition Volatile.cs:74

References System.Collections.Concurrent.ConcurrentQueueSegment< T >._frozenForEnqueues, System.Collections.Concurrent.ConcurrentQueueSegment< T >._headAndTail, System.Collections.Concurrent.ConcurrentQueueSegment< T >._preservedForObservation, System.Collections.Concurrent.ConcurrentQueueSegment< T >._slots, System.Collections.Concurrent.ConcurrentQueueSegment< T >._slotsMask, System.Threading.Interlocked.CompareExchange(), System.Collections.Concurrent.ConcurrentQueueSegment< T >.FreezeOffset, System.Collections.Concurrent.PaddedHeadAndTail.Head, System.Collections.Concurrent.ConcurrentQueueSegment< T >.Slot.Item, System.item, System.Threading.Volatile.Read(), System.Threading.SpinWait.SpinOnce(), System.Collections.Concurrent.PaddedHeadAndTail.Tail, and System.Threading.Volatile.Write().