public void FinalizeOrder() { var called = string.Empty; IEnumerator get() { yield return(null); } var routines = new List <Finalizable>(); var routineA = new Finalizable { wrapped = get() }; var routineB = new Finalizable { wrapped = get() }; var stacking = new DurationStacking(); stacking.Add(routineA, routines, a => a.OnFinalize += () => called += "wr"); stacking.Add(routineB, routines, a => a.OnFinalize += () => called += "wr"); routineA.OnFinalize += () => called += "a"; routineB.OnFinalize += () => called += "b"; var concat = routines[0]; concat.MoveNext(); concat.MoveNext(); concat.MoveNext(); Assert.AreEqual("abwr", called); }
public void ConcatSecond() { var called = string.Empty; IEnumerator get(string v) { called += v; yield return(null); } var routines = new List <Finalizable>(); var routineA = new Finalizable { wrapped = get("f") }; var routineB = new Finalizable { wrapped = get("s") }; var stacking = new DurationStacking(); stacking.Add(routineA, routines, _ => { }); stacking.Add(routineB, routines, _ => { }); var concat = routines[0]; concat.MoveNext(); concat.MoveNext(); Assert.AreEqual("fs", called); }
public void OnFinalizeSetToNull() { var called = 0; IEnumerator get() { yield return(null); yield return(null); } var managed = new Finalizable { wrapped = get() }; managed.OnFinalize += () => ++ called; managed.MoveNext(); managed.MoveNext(); managed.MoveNext(); managed.wrapped = get(); managed.MoveNext(); managed.MoveNext(); managed.MoveNext(); Assert.AreEqual(1, called); }
public void OnFinalize() { var count = 0; var called = 0; IEnumerator get() { ++count; yield return(null); ++count; yield return(null); } var managed = new Finalizable { wrapped = get() }; managed.OnFinalize += () => called = count; managed.MoveNext(); managed.MoveNext(); managed.MoveNext(); Assert.AreEqual(2, called); }
private static void Main(string[] args) { Console.WriteLine("Creating two trackers..."); var finalizable = new Finalizable(); // detect object's access when there isn't reference from root application var weakTracker = new WeakReferenceTracker(finalizable, false); weakTracker.ReferenceDied += () => Console.WriteLine("Short weak reference is dead"); // detect object's finalize when destructor worked var resurectionTracker = new WeakReferenceTracker(finalizable, true); resurectionTracker.ReferenceDied += () => Console.WriteLine("Long weak reference is dead"); Console.WriteLine("Forcing 0th generation GC..."); GC.Collect(0); // moved finalizable object to freachable queue Thread.Sleep(100); Console.WriteLine("Forcing 1th generation GC..."); GC.Collect(1); // removed object from freachable queue and finalize destroy them GC.KeepAlive(weakTracker); GC.KeepAlive(resurectionTracker); Console.ReadLine(); }
static void Main(string[] args) { Console.WriteLine("Creating 2 trackers..."); Thread.Sleep(1000); var finalizable = new Finalizable(); var weakTracker = new WeakReferenceTracker(finalizable, false); weakTracker.ReferenceDied += () => Console.WriteLine("Short weak reference is dead"); // var resurectionTracker = new WeakReferenceTracker(finalizable, true); resurectionTracker.ReferenceDied += () => Console.WriteLine("Long weak reference is dead"); Console.WriteLine("Forcing 0th generation GC..."); GC.Collect(0); Thread.Sleep(100); Console.WriteLine("Forcing 1th generation GC..."); GC.Collect(1); Thread.Sleep(100); // vor chjnji Tracker ner@ GC.KeepAlive(weakTracker); GC.KeepAlive(resurectionTracker); // Creating 2 trackers... // Forcing 0th generation GC... // Finalizable.dtor // Short weak reference is dead // Forcing 1th generation GC... // Long weak reference is dead }
public void Push(Effect effect) { Finalizable routine = this.effectToRoutine(effect); routine.OnFinalize += () => effects.Remove(effect); effects[effect] = routine; onPull?.Invoke(routine); }
public void AddNew() { var routines = new List <Finalizable>(); var routine = new Finalizable(); var stacking = new IntensityStacking(); stacking.Add(routine, routines, _ => { }); CollectionAssert.AreEqual(new Finalizable[] { routine }, routines); }
public void Add(Finalizable effectRoutine, List <Finalizable> routines, Action <Finalizable> onAdd) { (Action <Finalizable> apply, Finalizable wrapper) = routines.Count switch { 0 => (routines.Add + onAdd, new Finalizable { wrapped = effectRoutine }), _ => (DurationStacking.Concat(effectRoutine), routines.First()), }; apply(wrapper); }
public void DontAddSecond() { var routines = new List <Finalizable>(); var routine = new Finalizable(); var stacking = new DurationStacking(); stacking.Add(routine, routines, _ => { }); stacking.Add(routine, routines, _ => { }); Assert.AreEqual(1, routines.Count); }
public void AddNewOnAdd() { var called = default(Finalizable); var routines = new List <Finalizable>(); var routine = new Finalizable(); var stacking = new DurationStacking(); stacking.Add(routine, routines, a => called = a); Assert.AreSame(routines[0], called); }
private IEnumerator GetNext() { while (this.effects.Count > 0) { Finalizable routine = this.effectToRoutine(this.effects.Peek()); while (routine.MoveNext()) { yield return(routine.Current); } this.effects.Dequeue(); } }
public void Push(Effect effect) { this.effects.Enqueue(effect); if (this.wrapper == null) { this.wrapper = new Finalizable { wrapped = this.GetNext() }; this.wrapper.OnFinalize += () => this.wrapper = null; this.onPull?.Invoke(this.wrapper); } }
public void Cancel() { if (this.wrapper != null && this.onCancel != null) { this.onCancel(this.wrapper); } if (this.effects.Count > 0) { this.effects.Peek().Revert(); } this.wrapper = null; this.effects.Clear(); }
public void AddNew() { var routines = new List <Finalizable>(); var routine = new Finalizable(); var stacking = new DurationStacking(); stacking.Add(routine, routines, _ => { }); CollectionAssert.AreEqual( new Finalizable[] { routine }, routines.Select(f => f.wrapped) ); }
public static int Main(String[] args) { var t = new Tests(); var thread = new Thread(delegate() { t.Obj = new Finalizable(); t.Obj2 = new Finalizable(); t.Obj3 = new Finalizable(); t.Obj4 = retain = new Finalizable(); retain.a = 0x1029458; }); thread.Start(); thread.Join(); GC.Collect(0); GC.Collect(); GC.WaitForPendingFinalizers(); GC.WaitForPendingFinalizers(); if (t.Obj != null) { return(1); } if (t.Obj2 != null) { return(2); } if (t.Obj3 == null) { return(3); } //overflow the nursery, make sure we fill it for (int i = 0; i < 1000 * 1000 * 10; ++i) { new OneField(); } if (retain.a != 0x1029458) { return(4); } retain = null; GC.Collect(); GC.WaitForPendingFinalizers(); GC.WaitForPendingFinalizers(); if (t.Obj4 != null) { return(5); } return(0); }
public void Reset() { IEnumerator get() { yield break; } var enumerator = get(); var managed = new Finalizable { wrapped = enumerator }; Assert.Throws <NotSupportedException>(() => managed.Reset()); }
public static int Main(String[] args) { var t = new Tests(); FinalizerHelpers.PerformNoPinAction(delegate() { FinalizerHelpers.PerformNoPinAction(delegate() { t.Obj = new Finalizable(); t.Obj2 = new Finalizable(); t.Obj3 = new Finalizable(); t.Obj4 = retain = new Finalizable(); retain.a = 0x1029458; }); GC.Collect(0); GC.Collect(); GC.WaitForPendingFinalizers(); if (t.Obj != null) { Environment.Exit(1); } if (t.Obj2 != null) { Environment.Exit(2); } if (t.Obj3 == null) { Environment.Exit(3); } //overflow the nursery, make sure we fill it for (int i = 0; i < 1000 * 1000 * 10; ++i) { new OneField(); } if (retain.a != 0x1029458) { Environment.Exit(4); } retain = null; }); GC.Collect(); GC.WaitForPendingFinalizers(); if (t.Obj4 != null) { return(5); } return(0); }
public void MoveNext() { IEnumerator get() { yield return(null); yield return(null); } var managed = new Finalizable { wrapped = get() }; Assert.AreEqual( (true, true, false), (managed.MoveNext(), managed.MoveNext(), managed.MoveNext()) ); }
public IEnumerator OnCancelStopsCoroutine() { var called = 0; IEnumerator create() { while (true) { yield return(new WaitForFixedUpdate()); ++called; } } var routine = new Finalizable { wrapped = create() }; var cancel = default(Action <Finalizable>); var runner = new GameObject("runner").AddComponent <MockEffectRunner>(); runner.routineFactory = new MockEffectRoutineFactory(); runner.getStack = _ => (_, onPull, onCancel) => { onPull?.Invoke(routine); cancel = onCancel; return(new MockStack()); }; yield return(new WaitForEndOfFrame()); runner.Push(new Effect()); yield return(new WaitForFixedUpdate()); cancel?.Invoke(routine); yield return(new WaitForFixedUpdate()); yield return(new WaitForFixedUpdate()); Assert.AreEqual(1, called); }
public void Current() { IEnumerator get() { yield return(3); yield return("hello"); } var managed = new Finalizable { wrapped = get() }; managed.MoveNext(); var a = (int)managed.Current; managed.MoveNext(); var b = (string)managed.Current; Assert.AreEqual((3, "hello"), (a, b)); }
public void EnumerateWrapped() { var called = 0; IEnumerator get() { ++called; yield return(null); ++called; yield return(null); } var managed = new Finalizable { wrapped = get() }; managed.MoveNext(); managed.MoveNext(); managed.MoveNext(); Assert.AreEqual(2, called); }
private static Action <Finalizable> Concat(Finalizable snd) => fst => fst.wrapped = fst.wrapped.Concat(snd);
private void CancelEffect(Finalizable routine) { this.StopCoroutine(routine); }
private void StartEffect(Finalizable routine) { this.StartCoroutine(routine); }
public void Add(Finalizable effectRoutine, List <Finalizable> routines, Action <Finalizable> onAdd) { routines.Add(effectRoutine); onAdd(effectRoutine); }