From 30dfbf22bc9cb87c47ec6dde88d2e7b0ea4ae50c Mon Sep 17 00:00:00 2001 From: Sergey Andreenko Date: Tue, 17 Apr 2018 09:43:59 -0700 Subject: [PATCH] Fix GC tests. (#17594) * Fix dlbigleak * cleanup dlstack * Fix doublinknoleak * Fix doublinkstay * Fix dlcollect * Fix doublinkgen * Fix dlbigleakthd --- .../GC/Scenarios/DoublinkList/dlbigleak.cs | 24 +++++++++++----- .../GC/Scenarios/DoublinkList/dlbigleakthd.cs | 28 +++++++++++++------ .../GC/Scenarios/DoublinkList/dlcollect.cs | 23 ++++++++++----- .../src/GC/Scenarios/DoublinkList/dlstack.cs | 6 ++-- .../GC/Scenarios/DoublinkList/doublinkgen.cs | 16 +++++++++-- .../Scenarios/DoublinkList/doublinknoleak.cs | 24 +++++++++++----- .../GC/Scenarios/DoublinkList/doublinkstay.cs | 23 ++++++++++----- 7 files changed, 102 insertions(+), 42 deletions(-) diff --git a/tests/src/GC/Scenarios/DoublinkList/dlbigleak.cs b/tests/src/GC/Scenarios/DoublinkList/dlbigleak.cs index c72c8c089c0f..eee0b7411835 100644 --- a/tests/src/GC/Scenarios/DoublinkList/dlbigleak.cs +++ b/tests/src/GC/Scenarios/DoublinkList/dlbigleak.cs @@ -12,6 +12,7 @@ namespace DoubLink { using System; + using System.Runtime.CompilerServices; public class DLBigLeak { @@ -65,13 +66,7 @@ public static int Main(System.String [] Args) public bool runTest(int iRep, int iObj) { - Mv_Doub = new DoubLink[iRep]; - for(int i=0; i<10; i++) - { - SetLink(iRep, iObj); - MakeLeak(iRep); - GC.Collect(); - } + CreateDLinkListsWithLeak(iRep, iObj, 10); GC.Collect(); GC.WaitForPendingFinalizers(); @@ -85,6 +80,21 @@ public bool runTest(int iRep, int iObj) } + [MethodImpl(MethodImplOptions.NoInlining)] + // Do not inline the method that creates GC objects, because it could + // extend their live intervals until the end of the parent method. + public void CreateDLinkListsWithLeak(int iRep, int iObj, int iters) + { + Mv_Doub = new DoubLink[iRep]; + for (int i = 0; i < iters; i++) + { + SetLink(iRep, iObj); + MakeLeak(iRep); + GC.Collect(); + } + } + + public void SetLink(int iRep, int iObj) { diff --git a/tests/src/GC/Scenarios/DoublinkList/dlbigleakthd.cs b/tests/src/GC/Scenarios/DoublinkList/dlbigleakthd.cs index f1a322a2bf10..e38351b77c10 100644 --- a/tests/src/GC/Scenarios/DoublinkList/dlbigleakthd.cs +++ b/tests/src/GC/Scenarios/DoublinkList/dlbigleakthd.cs @@ -13,6 +13,7 @@ namespace DoubLink { using System.Threading; using System; using System.IO; + using System.Runtime.CompilerServices; public class DLBigLeakThd { @@ -84,6 +85,23 @@ public static int Main(System.String [] Args) public bool runTest(int iRep, int iObj, int iThd) + { + CreateDLinkListsWithLeak(iRep, iObj, iThd, 20); + + GC.Collect(); + GC.WaitForPendingFinalizers(); + GC.Collect(); + + int goal = iRep*15*iThd*iObj+20*iRep*iObj; + Console.WriteLine("{0}/{1} DLinkNodes finalized", DLinkNode.FinalCount, goal); + return (DLinkNode.FinalCount==goal); + } + + + [MethodImpl(MethodImplOptions.NoInlining)] + // Do not inline the method that creates GC objects, because it could + // extend their live intervals until the end of the parent method. + public void CreateDLinkListsWithLeak(int iRep, int iObj, int iThd, int iters) { this.iRep = iRep; this.iObj = iObj; @@ -94,7 +112,7 @@ public bool runTest(int iRep, int iObj, int iThd) Mv_Thread[i] = new Thread(new ThreadStart(this.ThreadStart)); Mv_Thread[i].Start( ); } - for(int i=0; i<20; i++) + for (int i = 0; i < iters; i++) { SetLink(iRep, iObj); MakeLeak(iRep); @@ -103,15 +121,7 @@ public bool runTest(int iRep, int iObj, int iThd) { Mv_Thread[i].Join(); } - Mv_Doub = null; - GC.Collect(); - GC.WaitForPendingFinalizers(); - GC.Collect(); - - int goal = iRep*15*iThd*iObj+20*iRep*iObj; - Console.WriteLine("{0}/{1} DLinkNodes finalized", DLinkNode.FinalCount, goal); - return (DLinkNode.FinalCount==goal); } diff --git a/tests/src/GC/Scenarios/DoublinkList/dlcollect.cs b/tests/src/GC/Scenarios/DoublinkList/dlcollect.cs index f7aa10dccb26..98d803e1c8ec 100644 --- a/tests/src/GC/Scenarios/DoublinkList/dlcollect.cs +++ b/tests/src/GC/Scenarios/DoublinkList/dlcollect.cs @@ -93,15 +93,9 @@ public bool DrainFinalizerQueue(int iRep, int iObj) public bool runTest(int iRep, int iObj) { + CreateDLinkListsWithLeak(iRep, iObj, 10); - Mv_Collect = new List(iRep); bool success = false; - for(int i=0; i <10; i++) - { - SetLink(iRep, iObj); - Mv_Collect.RemoveRange(0, Mv_Collect.Count); - GC.Collect(); - } if (DrainFinalizerQueue(iRep, iObj)) { @@ -113,6 +107,21 @@ public bool runTest(int iRep, int iObj) } + [MethodImpl(MethodImplOptions.NoInlining)] + // Do not inline the method that creates GC objects, because it could + // extend their live intervals until the end of the parent method. + public void CreateDLinkListsWithLeak(int iRep, int iObj, int iters) + { + Mv_Collect = new List(iRep); + for(int i = 0; i < iters; i++) + { + SetLink(iRep, iObj); + Mv_Collect.RemoveRange(0, Mv_Collect.Count); + GC.Collect(); + } + } + + public void SetLink(int iRep, int iObj) { Mv_Doub = new DoubLink[iRep]; diff --git a/tests/src/GC/Scenarios/DoublinkList/dlstack.cs b/tests/src/GC/Scenarios/DoublinkList/dlstack.cs index 585c6a267093..c5c31eb9ce67 100644 --- a/tests/src/GC/Scenarios/DoublinkList/dlstack.cs +++ b/tests/src/GC/Scenarios/DoublinkList/dlstack.cs @@ -94,7 +94,7 @@ public bool DrainFinalizerQueue(int iRep, int iObj) public bool runTest(int iRep, int iObj) { - CreateDLinkListsWithLeak(iRep, iObj); + CreateDLinkListsWithLeak(iRep, iObj, 10); bool success = false; if (DrainFinalizerQueue(iRep, iObj)) @@ -111,9 +111,9 @@ public bool runTest(int iRep, int iObj) [MethodImpl(MethodImplOptions.NoInlining)] // Do not inline the method that creates GC objects, because it could // extend their live intervals until the end of the parent method. - public void CreateDLinkListsWithLeak(int iRep, int iObj) + public void CreateDLinkListsWithLeak(int iRep, int iObj, int iters) { - for(int i=0; i <10; i++) + for(int i = 0; i < iters; i++) { SetLink(iRep, iObj); MakeLeak(iRep); diff --git a/tests/src/GC/Scenarios/DoublinkList/doublinkgen.cs b/tests/src/GC/Scenarios/DoublinkList/doublinkgen.cs index 0f1016c3d010..0962cb39a209 100644 --- a/tests/src/GC/Scenarios/DoublinkList/doublinkgen.cs +++ b/tests/src/GC/Scenarios/DoublinkList/doublinkgen.cs @@ -91,8 +91,8 @@ public bool DrainFinalizerQueue(int iRep, int iObj) public bool runTest(int iRep, int iObj) { - SetLink(iRep, iObj); - Mv_Doub = null; + CreateDLinkListsWithLeak(iRep, iObj); + bool success = false; if (DrainFinalizerQueue(iRep, iObj)) @@ -107,6 +107,18 @@ public bool runTest(int iRep, int iObj) } + + + [MethodImpl(MethodImplOptions.NoInlining)] + // Do not inline the method that creates GC objects, because it could + // extend their live intervals until the end of the parent method. + public void CreateDLinkListsWithLeak(int iRep, int iObj) + { + SetLink(iRep, iObj); + Mv_Doub = null; + } + + public void SetLink(int iRep, int iObj) { for(int i=0; i