Merge pull request #5714 from alexischr/update_bockbuild
[mono.git] / mono / tests / sgen-new-threads-dont-join-stw.cs
1 using System;
2 using System.Timers;
3 using System.Threading;
4 using System.Collections;
5 using System.Collections.Generic;
6
7 class T {
8
9     static int count = 0;
10     static object count_lock = new object();
11
12     const long N = 500000;
13     const int num_threads = 8;
14
15     static void UseMemory () {
16         
17         for (int i = 0; i < N; ++i) {
18
19             var l1 = new ArrayList ();
20             l1.Add(""+i);
21             var l2 = new ArrayList ();
22             l2.Add(""+(i+1));
23             var l3 = new ArrayList ();
24             l3.Add(""+(i+2));
25             var l4 = new ArrayList ();
26             l4.Add(""+(i+3));
27         }
28        
29         
30         lock (count_lock)
31         {
32             count++;
33             Monitor.PulseAll(count_lock);
34         }
35     }
36
37     static void Timer_Elapsed(object sender, EventArgs e)
38     {
39         HashSet<string> h = new HashSet<string>();
40         for (int j = 0; j < 10000; j++)
41         {
42             h.Add(""+j+""+j);
43         }
44     }
45
46     static void Main (string[] args) {
47         int iterations = 0;
48
49         for (TestTimeout timeout = TestTimeout.Start(TimeSpan.FromSeconds(TestTimeout.IsStressTest ? 120 : 5)); timeout.HaveTimeLeft;)
50         {
51             count = 0;
52
53             List<Thread> threads = new List<Thread>();
54             List<System.Timers.Timer> timers = new List<System.Timers.Timer>();
55
56             for (int i = 0; i < num_threads; i++)
57             {
58                 Thread t3 = new Thread (delegate () { 
59                     UseMemory();
60                     });
61
62                 t3.Start ();
63
64                 System.Timers.Timer timer = new System.Timers.Timer();
65                 timer.Elapsed += Timer_Elapsed;
66                 timer.AutoReset = false;
67                 timer.Interval = 1000;
68                 timer.Start();
69                 timers.Add(timer);
70             }
71             
72             for (int i = 0; i < 4000; i++)
73             {
74                 System.Timers.Timer timer = new System.Timers.Timer();
75                 timer.Elapsed += Timer_Elapsed;
76                 timer.AutoReset = false;
77                 timer.Interval = 500;
78                 timer.Start();
79                 timers.Add(timer);
80             }
81
82             lock (count_lock)
83             {
84                 while (count < num_threads)
85                 {
86                     Console.Write (".");
87                     Monitor.Wait(count_lock);
88                 }
89             }
90
91             foreach (var t in threads)
92             {
93                 t.Join();
94             }
95
96             Console.WriteLine ();
97             iterations += 1;
98         }
99
100         Console.WriteLine ($"done {iterations} iterations");
101     }
102 }