Merge pull request #5406 from kumpera/fix_12157
[mono.git] / mono / tests / sgen-bridge-major-fragmentation.cs
1 using System;
2 using System.Threading;
3
4 //64 / 128 size
5 public class NonBridge {
6         public object a,b,c,d,e,f,g,h,i,j,k,l,m,n;
7 }
8
9 public class Bridge {
10         public object a,b,c,d,e,f,g,h,i,j,k,l,m,n;
11         
12         ~Bridge () {}
13 }
14
15 class Driver {
16         static void LogLine (string message) {
17                 Console.WriteLine ("[" + DateTime.Now + "] " + message);
18         }
19         //we fill 16Mb worth of stuff, eg, 256k objects
20         const int major_fill = 1024 * 256;
21
22         //4mb nursery with 64 bytes objects -> alloc half
23         const int nursery_obj_count = 16 * 1024;
24
25         static void CrashMainLoop () {
26                 var arr = new object [major_fill];
27                 for (int i = 0; i < major_fill; ++i)
28                         arr [i] = new NonBridge ();
29                 GC.Collect (1);
30                 LogLine ("major fill done");
31
32                 //induce massive fragmentation
33                 for (int i = 0; i < major_fill; i += 4) {
34                         arr [i + 1] = null;
35                         arr [i + 2] = null;
36                         arr [i + 3] = null;
37                 }
38                 GC.Collect (1);
39                 LogLine ("fragmentation done");
40
41                 //since 50% is garbage, do 2 fill passes
42                 for (int j = 0; j < 2; ++j) {
43                         for (int i = 0; i < major_fill; ++i) {
44                                 if ((i % 1000) == 0)
45                                         new Bridge ();
46                                 else
47                                         arr [i] = new Bridge ();
48                         }
49                 }
50                 LogLine ("done spewing bridges");
51                 
52                 for (int i = 0; i < major_fill; ++i)
53                         arr [i] = null;
54                 GC.Collect ();
55         }
56         
57
58         static void Main () {
59                 const int loops = 4;
60                 for (int i = 0; i < loops; ++i) {
61                         LogLine ("CrashLoop " + (i + 1) + "/" + loops);
62                         CrashMainLoop ();
63                 }
64                 LogLine ("done");
65                 GC.Collect ();
66                 GC.WaitForPendingFinalizers ();
67                 GC.Collect ();
68                 GC.WaitForPendingFinalizers ();
69         }
70 }