[Microsoft.Build] Ignore ThreadAbortException in BuildNodeManager
[mono-project.git] / mono / tests / sgen-bridge-major-fragmentation.cs
blobc954ade20b8d539a9e221d41fa0036361391fcd2
1 using System;
2 using System.Threading;
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;
9 public class Bridge {
10 public object a,b,c,d,e,f,g,h,i,j,k,l,m,n;
12 ~Bridge () {}
15 class Driver {
16 static void LogLine (string message) {
17 Console.WriteLine ("[" + DateTime.Now + "] " + message);
19 //we fill 16Mb worth of stuff, eg, 256k objects
20 const int major_fill = 1024 * 256;
22 //4mb nursery with 64 bytes objects -> alloc half
23 const int nursery_obj_count = 16 * 1024;
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");
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;
38 GC.Collect (1);
39 LogLine ("fragmentation done");
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 ();
50 LogLine ("done spewing bridges");
52 for (int i = 0; i < major_fill; ++i)
53 arr [i] = null;
54 GC.Collect ();
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 ();
64 LogLine ("done");
65 GC.Collect ();
66 GC.WaitForPendingFinalizers ();
67 GC.Collect ();
68 GC.WaitForPendingFinalizers ();