Ejemplo n.º 1
0
        public async Task TestObjTracker()
        {
            int    nThreads = 10;
            int    nIter    = 100;
            int    cnt      = 0;
            object hardref  = null;

            var objTracker = new ObjTracker(new PerfGraphToolWindowControl());

            try
            {
                using (var cts = new CancellationTokenSource())
                {
                    using (var doneEvent = new ManualResetEventSlim())
                    {
                        var tasks = new Task[nThreads];
                        for (int iThread = 0; iThread < nThreads; iThread++)
                        {
                            var tt = iThread;
                            tasks[iThread] = Task.Run(() =>
                            {
                                Thread.CurrentThread.Name = $"task {tt}";
                                for (int i = 0; i < nIter; i++)
                                {
                                    var obj = new MyBigData(cnt);
                                    Interlocked.Increment(ref cnt);
                                    Interlocked.CompareExchange(ref hardref, obj, null);
                                    objTracker.AddObjectToTrack(obj, ObjSource.FromTest);
                                }
                            }
                                                      );
                        }
                        await Task.Run(() => Task.WaitAll(tasks));

                        doneEvent.Set();
                    }
                    var res = objTracker.GetCounts();
                    cts.Cancel();
                    Assert.AreEqual(1, res.Item1.Count, "only 1 left in hardref");
                }
                //                    Assert.AreEqual(nIter * nThreads, coll.Count, $" should be equal");
            }
            catch (Exception ex)
            {
                LogMessage($"got exception {ex}");
                throw;
            }
            //LogTestMessage($"expect {nThreads * nIter} cnt = {cnt} CollSize={coll.Count}");
            //Assert.AreEqual(nIter * nThreads, cnt, $" items added should be equal");
            //Assert.IsTrue(nIter * nThreads > coll.Count, $" coll count should be < because GC");
            //Assert.AreEqual(1, coll.Count, "GC collected all but hardref");
        }
Ejemplo n.º 2
0
        public void TestReflection()
        {
            var addedObjects = new List <string>();

            _AddObjectAction = (object o) =>
            {
                addedObjects.Add($"added {o.ToString()}");
            };

            var objectTracker = new ObjTracker(new PerfGraphToolWindowControl());

            AddObject(this);

            LogMessage($"done scanning");
            foreach (var itm in addedObjects)
            {
                LogMessage($"{itm}");
            }
        }
Ejemplo n.º 3
0
        public async Task TestObjTrackerWithDisposable()
        {
            int nThreads = 10;
            int nIter    = 1000;
            int cnt      = 0;
            var rand     = new Random(1);
            ConcurrentBag <object> hashHardRefs = new ConcurrentBag <object>();
            var objTracker = new ObjTracker(new PerfGraphToolWindowControl());

            try
            {
                using (var cts = new CancellationTokenSource())
                {
                    using (var doneEvent = new ManualResetEventSlim())
                    {
                        var tasks = new Task[nThreads];
                        for (int iThread = 0; iThread < nThreads; iThread++)
                        {
                            tasks[iThread] = Task.Run(() =>
                            {
                                for (int i = 0; i < nIter; i++)
                                {
                                    var obj = new MyBigData(cnt);
                                    Interlocked.Increment(ref cnt);
                                    objTracker.AddObjectToTrack(obj, ObjSource.FromTest);
                                    if (rand.Next(100) < 50)
                                    {
                                        obj.Dispose();
                                    }
                                    if (rand.Next(100) < 50)
                                    {
                                        hashHardRefs.Add(obj);
                                    }
                                }
                            }
                                                      );
                        }
                        await Task.Run(() => Task.WaitAll(tasks));

                        doneEvent.Set();
                    }
                    var res = objTracker.GetCounts();
                    LogMessage($"Got results: live: {res.Item1.Count}  Leaked: {res.Item2.Count}  HardRefsCount={hashHardRefs.Count}");
                    foreach (var live in res.Item1)
                    {
                        LogMessage($"  Live {live.Value,3} {live.Key}");
                    }
                    foreach (var leak in res.Item2)
                    {
                        LogMessage($"  Leaked {leak._serialNo} {leak.Descriptor}");
                    }
                    cts.Cancel();
                    Assert.AreEqual(1, res.Item1.Count, "only 1 leaking type");
                    Assert.IsTrue(res.Item1.Values.First() > 1000, "# live > 1000");
                    Assert.IsTrue(res.Item2.Count > 1000, "# leaked > 1000");
                }
                //                    Assert.AreEqual(nIter * nThreads, coll.Count, $" should be equal");
            }
            catch (Exception ex)
            {
                LogMessage($"got exception {ex}");
                throw;
            }
            //LogTestMessage($"expect {nThreads * nIter} cnt = {cnt} CollSize={coll.Count}");
            //Assert.AreEqual(nIter * nThreads, cnt, $" items added should be equal");
            //Assert.IsTrue(nIter * nThreads > coll.Count, $" coll count should be < because GC");
            //Assert.AreEqual(1, coll.Count, "GC collected all but hardref");
        }