From 14f94ad3106e822ffa54369d33a1ecfa5bcac93b Mon Sep 17 00:00:00 2001 From: Sung Yoon Whang Date: Wed, 18 Apr 2018 21:46:58 -0700 Subject: [PATCH] Fix GC leakwheel scenario test (#17656) * Fix GC leakwheel scenario test * Should be passing for most cases --- tests/src/GC/Scenarios/LeakWheel/leakwheel.cs | 77 +++++++++++++++------------ 1 file changed, 43 insertions(+), 34 deletions(-) diff --git a/tests/src/GC/Scenarios/LeakWheel/leakwheel.cs b/tests/src/GC/Scenarios/LeakWheel/leakwheel.cs index 51715df..ccdda00 100644 --- a/tests/src/GC/Scenarios/LeakWheel/leakwheel.cs +++ b/tests/src/GC/Scenarios/LeakWheel/leakwheel.cs @@ -100,10 +100,42 @@ namespace DefaultNamespace { Console.WriteLine("Repro with these values:"); Console.WriteLine("iMem= {0} MB, iIter= {1}, iTable={2} iSeed={3}", iMem, iIter, iTable, iSeed ); - LeakWheel mv_obj = new LeakWheel(); + LeakWheel my_obj = new LeakWheel(); + + while(!my_obj.RunGame()) + { + GC.Collect(2); + GC.WaitForPendingFinalizers(); + GC.Collect(2); + + Console.WriteLine( "After Delete and GCed all Objects: {0}", GC.GetTotalMemory(false) ); + + } + GC.Collect(2); + GC.WaitForPendingFinalizers(); + + Thread.Sleep(100); + GC.Collect(2); + GC.WaitForPendingFinalizers(); + GC.Collect(2); + GC.WaitForPendingFinalizers(); + GC.Collect(2); + GC.WaitForPendingFinalizers(); + + Console.WriteLine("When test finished: {0}", GC.GetTotalMemory(false)); + Console.WriteLine("Created VarAry objects: {0} Finalized VarAry Objects: {1}", Node.iVarAryCreat, Node.iVarAryFinal); + Console.WriteLine("Created BitArray objects: {0} Finalized BitArray Objects: {1}", Node.iBitAryCreat, Node.iBitAryFinal); + Console.WriteLine("Created small objects: {0} Finalized small Objects: {1}", Node.iSmallCreat, Node.iSmallFinal); + Console.WriteLine("Created BinaryTree objects: {0} Finalized BinaryTree Objects: {1}", Node.iBiTreeCreat, Node.iBiTreeFinal); + Console.WriteLine("Created Thread objects: {0} Finalized Thread Objects: {1}", Node.iThrdCreat, Node.iThrdFinal); + - if(mv_obj.RunGame()) + if (Node.iBitAryCreat == Node.iBitAryFinal && + Node.iBiTreeCreat == Node.iBiTreeFinal && + Node.iSmallCreat == Node.iSmallFinal && + Node.iThrdCreat == Node.iThrdFinal && + Node.iVarAryCreat == Node.iVarAryFinal) { Console.WriteLine("Test Passed!"); return 100; @@ -119,11 +151,12 @@ namespace DefaultNamespace { LstNode = null; } + [MethodImplAttribute(MethodImplOptions.NoInlining)] public bool RunGame() { Dictionary oTable = new Dictionary(10); DestroyLstNode(); //the last node in the node chain// - Random r = new Random (LeakWheel.iSeed); + Random r = new Random (LeakWheel.iSeed); for(int i=0; i= iMem ) { DestroyLstNode(); - - GC.Collect( ); - GC.WaitForPendingFinalizers(); - GC.Collect( ); - - Console.WriteLine( "After Delete and GCed all Objects: {0}", GC.GetTotalMemory(false) ); - } - } + iIter -= i; // Reduce the iteration count by how far we went + return false; + } + } DestroyLstNode(); - - GC.Collect(); - GC.WaitForPendingFinalizers(); - - Thread.Sleep(100); - GC.Collect(); - GC.WaitForPendingFinalizers(); - GC.Collect(); - - - Console.WriteLine("When test finished: {0}", GC.GetTotalMemory(false)); - Console.WriteLine("Created VarAry objects: {0} Finalized VarAry Objects: {1}", Node.iVarAryCreat, Node.iVarAryFinal); - Console.WriteLine("Created BitArray objects: {0} Finalized BitArray Objects: {1}", Node.iBitAryCreat, Node.iBitAryFinal); - Console.WriteLine("Created small objects: {0} Finalized small Objects: {1}", Node.iSmallCreat, Node.iSmallFinal); - Console.WriteLine("Created BinaryTree objects: {0} Finalized BinaryTree Objects: {1}", Node.iBiTreeCreat, Node.iBiTreeFinal); - Console.WriteLine("Created Thread objects: {0} Finalized Thread Objects: {1}", Node.iThrdCreat, Node.iThrdFinal); - - - return (Node.iBitAryCreat == Node.iBitAryFinal && - Node.iBiTreeCreat == Node.iBiTreeFinal && - Node.iSmallCreat == Node.iSmallFinal && - Node.iThrdCreat == Node.iThrdFinal && - Node.iVarAryCreat == Node.iVarAryFinal); + return true; } + [MethodImplAttribute(MethodImplOptions.NoInlining)] public void SpinWheel( Dictionary oTable, Node node, Random r ) { int iKey;//the index which the new node will be set at @@ -205,6 +213,7 @@ namespace DefaultNamespace { //} } + [MethodImplAttribute(MethodImplOptions.NoInlining)] public void DeleteNode( int iKey, Dictionary oTable) { //iSwitch is 0, delete one child Node at iKey; -- 2.7.4