public void ResizeCompactsAllDead() { var a = Create("A"); var list = new WeakList <object>(); for (int i = 0; i < 9; i++) { Add(list, a); } Assert.Equal(list.WeakCount, list.TestOnly_UnderlyingArray.Length); // full a.AssertReleased(); var b = Create("B"); Add(list, b); // shrinks, #alive < length/4 Assert.Equal(4, list.TestOnly_UnderlyingArray.Length); Assert.Equal(1, list.WeakCount); b.AssertReleased(); list.ToArray(); // shrinks, #alive == 0 Assert.Equal(0, list.TestOnly_UnderlyingArray.Length); Assert.Equal(0, list.WeakCount); }
public void ResizeCompactsFirstFourth() { var a = Create("A"); var b = Create("B"); var list = new WeakList <object>(); for (int i = 0; i < 8; i++) { Add(list, a); } Add(list, b); Assert.Equal(list.WeakCount, list.TestOnly_UnderlyingArray.Length); // full a.Strong = null; while (a.Weak.IsAlive) { GC.Collect(2, GCCollectionMode.Forced); } Add(list, b); // shrinks, #alive < length/4 Assert.Equal(4, list.TestOnly_UnderlyingArray.Length); Assert.Equal(2, list.WeakCount); b.Strong = null; while (b.Weak.IsAlive) { GC.Collect(2, GCCollectionMode.Forced); } list.ToArray(); // shrinks, #alive == 0 Assert.Equal(0, list.TestOnly_UnderlyingArray.Length); Assert.Equal(0, list.WeakCount); }
public void EnumeratorCompacts() { var a = Create("a"); var b = Create("B"); var c = Create("C"); var d = Create("D"); var e = Create("E"); var list = new WeakList <object>(); Assert.Equal(0, list.TestOnly_UnderlyingArray.Length); Add(list, a); Assert.Equal(4, list.TestOnly_UnderlyingArray.Length); Add(list, b); Assert.Equal(4, list.TestOnly_UnderlyingArray.Length); Add(list, c); Assert.Equal(4, list.TestOnly_UnderlyingArray.Length); Add(list, d); Assert.Equal(4, list.TestOnly_UnderlyingArray.Length); Add(list, e); Assert.Equal(2 * 4 + 1, list.TestOnly_UnderlyingArray.Length); Assert.Equal(5, list.WeakCount); a.Strong = null; c.Strong = null; d.Strong = null; e.Strong = null; while (a.Weak.IsAlive || c.Weak.IsAlive || d.Weak.IsAlive || e.Weak.IsAlive) { GC.Collect(2, GCCollectionMode.Forced); } Assert.Equal(5, list.WeakCount); Assert.Same(null, list.GetWeakReference(0).GetTarget()); Assert.Same(b.Strong, list.GetWeakReference(1).GetTarget()); Assert.Same(null, list.GetWeakReference(2).GetTarget()); Assert.Same(null, list.GetWeakReference(3).GetTarget()); Assert.Same(null, list.GetWeakReference(4).GetTarget()); var array = list.ToArray(); Assert.Equal(1, array.Length); Assert.Same(b.Strong, array[0]); // list was compacted: Assert.Equal(1, list.WeakCount); Assert.Same(b.Strong, list.GetWeakReference(0).GetTarget()); Assert.Equal(4, list.TestOnly_UnderlyingArray.Length); GC.KeepAlive(b.Strong); }
public void EnumeratorCompacts() { var a = Create("a"); var b = Create("B"); var c = Create("C"); var d = Create("D"); var e = Create("E"); var list = new WeakList<object>(); Assert.Equal(0, list.TestOnly_UnderlyingArray.Length); Add(list, a); Assert.Equal(4, list.TestOnly_UnderlyingArray.Length); Add(list, b); Assert.Equal(4, list.TestOnly_UnderlyingArray.Length); Add(list, c); Assert.Equal(4, list.TestOnly_UnderlyingArray.Length); Add(list, d); Assert.Equal(4, list.TestOnly_UnderlyingArray.Length); Add(list, e); Assert.Equal(2 * 4 + 1, list.TestOnly_UnderlyingArray.Length); Assert.Equal(5, list.WeakCount); a.Strong = null; c.Strong = null; d.Strong = null; e.Strong = null; while (a.Weak.IsAlive || c.Weak.IsAlive || d.Weak.IsAlive || e.Weak.IsAlive) { GC.Collect(2, GCCollectionMode.Forced); } Assert.Equal(5, list.WeakCount); Assert.Same(null, list.GetWeakReference(0).GetTarget()); Assert.Same(b.Strong, list.GetWeakReference(1).GetTarget()); Assert.Same(null, list.GetWeakReference(2).GetTarget()); Assert.Same(null, list.GetWeakReference(3).GetTarget()); Assert.Same(null, list.GetWeakReference(4).GetTarget()); var array = list.ToArray(); Assert.Equal(1, array.Length); Assert.Same(b.Strong, array[0]); // list was compacted: Assert.Equal(1, list.WeakCount); Assert.Same(b.Strong, list.GetWeakReference(0).GetTarget()); Assert.Equal(4, list.TestOnly_UnderlyingArray.Length); GC.KeepAlive(b.Strong); }
public void EnumeratorCompacts() { var a = Create("a"); var b = Create("B"); var c = Create("C"); var d = Create("D"); var e = Create("E"); var list = new WeakList <object>(); Assert.Equal(0, list.TestOnly_UnderlyingArray.Length); Add(list, a); Assert.Equal(4, list.TestOnly_UnderlyingArray.Length); Add(list, b); Assert.Equal(4, list.TestOnly_UnderlyingArray.Length); Add(list, c); Assert.Equal(4, list.TestOnly_UnderlyingArray.Length); Add(list, d); Assert.Equal(4, list.TestOnly_UnderlyingArray.Length); Add(list, e); Assert.Equal(2 * 4 + 1, list.TestOnly_UnderlyingArray.Length); Assert.Equal(5, list.WeakCount); a.AssertReleased(); c.AssertReleased(); d.AssertReleased(); e.AssertReleased(); Assert.Equal(5, list.WeakCount); Assert.Same(null, list.GetWeakReference(0).GetTarget()); Assert.Same(b.GetReference(), list.GetWeakReference(1).GetTarget()); Assert.Same(null, list.GetWeakReference(2).GetTarget()); Assert.Same(null, list.GetWeakReference(3).GetTarget()); Assert.Same(null, list.GetWeakReference(4).GetTarget()); var array = list.ToArray(); Assert.Equal(1, array.Length); Assert.Same(b.GetReference(), array[0]); // list was compacted: Assert.Equal(1, list.WeakCount); Assert.Same(b.GetReference(), list.GetWeakReference(0).GetTarget()); Assert.Equal(4, list.TestOnly_UnderlyingArray.Length); GC.KeepAlive(b.GetReference()); }
public void EnumeratorCompacts() { var a = Create("a"); var b = Create("B"); var c = Create("C"); var d = Create("D"); var e = Create("E"); var list = new WeakList<object>(); Assert.Equal(0, list.TestOnly_UnderlyingArray.Length); Add(list, a); Assert.Equal(4, list.TestOnly_UnderlyingArray.Length); Add(list, b); Assert.Equal(4, list.TestOnly_UnderlyingArray.Length); Add(list, c); Assert.Equal(4, list.TestOnly_UnderlyingArray.Length); Add(list, d); Assert.Equal(4, list.TestOnly_UnderlyingArray.Length); Add(list, e); Assert.Equal(2 * 4 + 1, list.TestOnly_UnderlyingArray.Length); Assert.Equal(5, list.WeakCount); a.AssertReleased(); c.AssertReleased(); d.AssertReleased(); e.AssertReleased(); Assert.Equal(5, list.WeakCount); Assert.Same(null, list.GetWeakReference(0).GetTarget()); Assert.Same(b.GetReference(), list.GetWeakReference(1).GetTarget()); Assert.Same(null, list.GetWeakReference(2).GetTarget()); Assert.Same(null, list.GetWeakReference(3).GetTarget()); Assert.Same(null, list.GetWeakReference(4).GetTarget()); var array = list.ToArray(); Assert.Equal(1, array.Length); Assert.Same(b.GetReference(), array[0]); // list was compacted: Assert.Equal(1, list.WeakCount); Assert.Same(b.GetReference(), list.GetWeakReference(0).GetTarget()); Assert.Equal(4, list.TestOnly_UnderlyingArray.Length); GC.KeepAlive(b.GetReference()); }
public void ResizeCompactsAllDead() { var a = Create("A"); var list = new WeakList<object>(); for (int i = 0; i < 9; i++) { Add(list, a); } Assert.Equal(list.WeakCount, list.TestOnly_UnderlyingArray.Length); // full a.Strong = null; while (a.Weak.IsAlive) { GC.Collect(2, GCCollectionMode.Forced); } Add(list, a); // shrinks, #alive < length/4 Assert.Equal(4, list.TestOnly_UnderlyingArray.Length); Assert.Equal(1, list.WeakCount); list.ToArray(); // shrinks, #alive == 0 Assert.Equal(0, list.TestOnly_UnderlyingArray.Length); Assert.Equal(0, list.WeakCount); }
public void ResizeCompactsAllDead() { var a = Create("A"); var list = new WeakList<object>(); for (int i = 0; i < 9; i++) { Add(list, a); } Assert.Equal(list.WeakCount, list.TestOnly_UnderlyingArray.Length); // full a.AssertReleased(); var b = Create("B"); Add(list, b); // shrinks, #alive < length/4 Assert.Equal(4, list.TestOnly_UnderlyingArray.Length); Assert.Equal(1, list.WeakCount); b.AssertReleased(); list.ToArray(); // shrinks, #alive == 0 Assert.Equal(0, list.TestOnly_UnderlyingArray.Length); Assert.Equal(0, list.WeakCount); }