protected override void AddRangeInternal(T[] items, int startIndex, int count) { var rangeTail = new StackedBagNodeSlim <T> { Value = items[0] }; var rangeHead = rangeTail; for (var i = 1; i < count - 1; i++) { rangeHead = new StackedBagNodeSlim <T> { Value = items[i], Next = rangeHead } } ; if (count > 1) { rangeHead = new StackedBagNodeSlim <T> { Next = rangeHead } } ; Add(items[count - 1], rangeHead, rangeTail); if (KeepCount) { Interlocked.Add(ref _count, count); } }
protected override void Add(T value, StackedBagNodeSlim <T> rangeHead, StackedBagNodeSlim <T> rangeTail) { rangeHead.Value = value; SpinWait?spinner = null; StackedBagNodeSlim <T> localHead = null; do { if (localHead != null) { Spinner.Spin(ref spinner); } rangeTail.Next = localHead = Head; } while (Interlocked.CompareExchange(ref Head, rangeHead, localHead) != localHead); }