[Process] Do not use Exited as it's racy with Start and BeginOutputReadLine/BeginErro...
[mono.git] / mono / tests / test-runner.cs
index 7807c02dd598eac4d78183d46ea0c26d9379e43d..0f8b1b060ec7a22d6a89489eca9d076d0e8a527e 100644 (file)
@@ -201,38 +201,10 @@ public class TestRunner
                        info.RedirectStandardError = true;
                        Process p = new Process ();
                        p.StartInfo = info;
-                       p.EnableRaisingEvents = true;
 
                        ProcessData data = new ProcessData ();
                        data.test = test;
 
-                       p.Exited += delegate (object sender, EventArgs e) {
-                               // Anon methods share some of their state, so we can't use
-                               // variables which change during the loop (test, p)
-                               Process dead = (Process)sender;
-
-                               lock (monitor) {
-                                       if (dead.ExitCode == 0) {
-                                               if (concurrency == 1)
-                                                       Console.WriteLine ("passed.");
-                                               else
-                                                       Console.Write (".");
-                                               passed.Add(process_data [dead]);
-                                               npassed ++;
-                                       } else {
-                                               if (concurrency == 1)
-                                                       Console.WriteLine ("failed.");
-                                               else
-                                                       Console.Write ("F");
-                                               failed.Add (process_data [dead]);
-                                               nfailed ++;
-                                       }
-                                       processes.Remove (dead);
-                                       terminated.Add (dead);
-                                       Monitor.Pulse (monitor);
-                               }
-                       };
-
                        string log_prefix = "";
                        if (opt_set != null)
                                log_prefix = "." + opt_set.Replace ("-", "no").Replace (",", "_");
@@ -296,6 +268,33 @@ public class TestRunner
 
                        p.BeginOutputReadLine ();
                        p.BeginErrorReadLine ();
+
+                       ThreadPool.QueueUserWorkItem (o => {
+                               Process process = (Process) o;
+
+                               process.WaitForExit ();
+
+                               lock (monitor) {
+                                       if (process.ExitCode == 0) {
+                                               if (concurrency == 1)
+                                                       Console.WriteLine ("passed.");
+                                               else
+                                                       Console.Write (".");
+                                               passed.Add(process_data [process]);
+                                               npassed ++;
+                                       } else {
+                                               if (concurrency == 1)
+                                                       Console.WriteLine ("failed.");
+                                               else
+                                                       Console.Write ("F");
+                                               failed.Add (process_data [process]);
+                                               nfailed ++;
+                                       }
+                                       processes.Remove (process);
+                                       terminated.Add (process);
+                                       Monitor.Pulse (monitor);
+                               }
+                       }, p);
                }
 
                bool timed_out = false;