- lock (monitor) {
- while (processes.Count == concurrency) {
- /* Wait for one process to terminate */
- Monitor.Wait (monitor);
- }
-
- /* Cleaup terminated processes */
- foreach (Process dead in terminated) {
- if (process_data [dead].stdout != null)
- process_data [dead].stdout.Close ();
- if (process_data [dead].stderr != null)
- process_data [dead].stderr.Close ();
- // This is needed to avoid CreateProcess failed errors :(
- dead.Close ();
- }
- terminated.Clear ();
- }
-
- string test = ti.test;
- string opt_set = ti.opt_set;
-
- if (concurrency == 1)
- Console.Write ("Testing " + test + "... ");
-
- /* Spawn a new process */
- string process_args;
- if (opt_set == null)
- process_args = test;
- else
- process_args = "-O=" + opt_set + " " + test;
- ProcessStartInfo info = new ProcessStartInfo (runtime, process_args);
- info.UseShellExecute = false;
- info.RedirectStandardOutput = true;
- 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 (",", "_");
-
- data.stdoutFile = test + log_prefix + ".stdout";
- data.stdout = new StreamWriter (new FileStream (data.stdoutFile, FileMode.Create));
-
- data.stderrFile = test + log_prefix + ".stderr";
- data.stderr = new StreamWriter (new FileStream (data.stderrFile, FileMode.Create));