Skip to content

Commit af314f3

Browse files
Must read SequenceNumber before reading the Item (#78178)
Co-authored-by: vsadov <8218165+VSadov@users.noreply.github.com>
1 parent 89161f4 commit af314f3

File tree

1 file changed

+4
-6
lines changed

1 file changed

+4
-6
lines changed

src/libraries/System.Private.CoreLib/src/System/Collections/Concurrent/ConcurrentQueue.cs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -528,13 +528,11 @@ private static T GetItemWhenAvailable(ConcurrentQueueSegment<T> segment, int i)
528528

529529
// If the expected sequence number is not yet written, we're still waiting for
530530
// an enqueuer to finish storing it. Spin until it's there.
531-
if ((segment._slots[i].SequenceNumber & segment._slotsMask) != expectedSequenceNumberAndMask)
531+
SpinWait spinner = default;
532+
// Must read SequenceNumber before reading Item, thus Volatile.Read
533+
while ((Volatile.Read(ref segment._slots[i].SequenceNumber) & segment._slotsMask) != expectedSequenceNumberAndMask)
532534
{
533-
SpinWait spinner = default;
534-
while ((Volatile.Read(ref segment._slots[i].SequenceNumber) & segment._slotsMask) != expectedSequenceNumberAndMask)
535-
{
536-
spinner.SpinOnce();
537-
}
535+
spinner.SpinOnce();
538536
}
539537

540538
// Return the value from the slot.

0 commit comments

Comments
 (0)