in rd-net/Lifetimes/Lifetimes/LifetimedList.cs [158:209]
private bool EnsureCapacityNoLock(bool priority, out ValueLifetimed<T>[] items, out int marker, out int size)
{
myItems ??= new ValueLifetimed<T>[1];
marker = MarkerMutexSlice[myState];
if (mySize < myItems.Length && !priority)
{
items = myItems;
size = mySize;
return false;
}
var newSize = 0;
for (var i = 0; i < mySize; i++)
{
if (myItems[i].Lifetime.IsAlive)
newSize++;
}
if (newSize == 0) newSize = 1;
else newSize *= 2;
// we have to make new array ALWAYS at this point, because this method could be called during enumeration and we want enumeration to work in a snapshot fashion
var countAfterCleaning = 0;
var markerDecrement = 0;
var newItems = new ValueLifetimed<T>[newSize];
for (var i = 0; i < marker; i++)
{
ref var item = ref myItems[i];
if (item.Lifetime.IsAlive)
newItems[countAfterCleaning++] = item;
else
markerDecrement++;
}
var offset = priority ? 1 : 0; // reserve place for new priority item
for (var i = marker; i < mySize; i++)
{
ref var item = ref myItems[i];
if (item.Lifetime.IsAlive)
newItems[countAfterCleaning++ + offset] = item;
else if (i < marker)
markerDecrement++;
}
marker -= markerDecrement;
size = countAfterCleaning;
items = newItems;
return true;
}