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);
    }
Esempio n. 3
0
    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);
    }
Esempio n. 4
0
    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);
    }
Esempio n. 5
0
        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();
        }
Esempio n. 6
0
        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);
        }
Esempio n. 8
0
    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);
    }
Esempio n. 9
0
 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)
            );
    }
Esempio n. 16
0
    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);
    }
Esempio n. 17
0
    public void Reset()
    {
        IEnumerator get()
        {
            yield break;
        }

        var enumerator = get();
        var managed    = new Finalizable {
            wrapped = enumerator
        };

        Assert.Throws <NotSupportedException>(() => managed.Reset());
    }
Esempio n. 18
0
    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);
    }
Esempio n. 19
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);
    }
Esempio n. 21
0
    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));
    }
Esempio n. 22
0
    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);
    }
Esempio n. 23
0
 private static Action <Finalizable> Concat(Finalizable snd) => fst => fst.wrapped = fst.wrapped.Concat(snd);
Esempio n. 24
0
 private void CancelEffect(Finalizable routine)
 {
     this.StopCoroutine(routine);
 }
Esempio n. 25
0
 private void StartEffect(Finalizable routine)
 {
     this.StartCoroutine(routine);
 }
 public void Add(Finalizable effectRoutine, List <Finalizable> routines, Action <Finalizable> onAdd)
 {
     routines.Add(effectRoutine);
     onAdd(effectRoutine);
 }