From: Owen R. <exo...@us...> - 2004-03-29 11:06:39
|
Update of /cvsroot/ccnet/ccnet/project/core/util In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv26235/project/core/util Modified Files: ProcessExecutor.cs ProcessReader.cs Log Message: - updated cctray to allow launching web page is specified browser - set WebServiceProxy project build target - updated ProjectStartPublisher (almost finished) - updated ProcessExecutor to cleanly kill timed out processes Index: ProcessReader.cs =================================================================== RCS file: /cvsroot/ccnet/ccnet/project/core/util/ProcessReader.cs,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** ProcessReader.cs 23 Feb 2004 05:18:12 -0000 1.1 --- ProcessReader.cs 29 Mar 2004 10:55:11 -0000 1.2 *************** *** 8,15 **** { private Thread thread; ! private StreamReader stream; private string output; ! public ProcessReader(StreamReader stream) { this.thread = new Thread(new ThreadStart(ReadToEnd)); --- 8,15 ---- { private Thread thread; ! private TextReader stream; private string output; ! public ProcessReader(TextReader stream) { this.thread = new Thread(new ThreadStart(ReadToEnd)); *************** *** 25,28 **** --- 25,29 ---- { thread.Join(); + stream.Close(); } *************** *** 30,33 **** --- 31,35 ---- { thread.Abort(); + stream.Close(); } Index: ProcessExecutor.cs =================================================================== RCS file: /cvsroot/ccnet/ccnet/project/core/util/ProcessExecutor.cs,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** ProcessExecutor.cs 25 Mar 2004 06:50:58 -0000 1.3 --- ProcessExecutor.cs 29 Mar 2004 10:55:11 -0000 1.4 *************** *** 1,4 **** --- 1,5 ---- using System; using System.Diagnostics; + using System.ComponentModel; namespace ThoughtWorks.CruiseControl.Core.Util *************** *** 22,26 **** public virtual ProcessResult Execute(ProcessInfo processInfo) { ! using(Process process = System.Diagnostics.Process.Start(processInfo.startInfo)) { ProcessReader standardOutput = new ProcessReader(process.StandardOutput); --- 23,27 ---- public virtual ProcessResult Execute(ProcessInfo processInfo) { ! using(Process process = Process.Start(processInfo.startInfo)) { ProcessReader standardOutput = new ProcessReader(process.StandardOutput); *************** *** 29,47 **** standardError.Start(); ! if (process.WaitForExit(Timeout)) { standardOutput.WaitForExit(); standardError.WaitForExit(); - return new ProcessResult(standardOutput.Output, standardError.Output, process.ExitCode, ! process.HasExited); } else { ! ! standardOutput.Abort(); ! standardError.Abort(); process.Kill(); ! Console.WriteLine("Killed the process status:{0}", process.HasExited); ! return new ProcessResult(standardOutput.Output, standardError.Output, KILLED_PROCESS_EXIT_CODE, ! process.HasExited); } } } --- 30,49 ---- standardError.Start(); ! bool hasExited = process.WaitForExit(Timeout); ! if (hasExited) { standardOutput.WaitForExit(); standardError.WaitForExit(); } else { ! Log.Warning(string.Format("Process timed out: {0} {1}. Process id: {2}", processInfo.FileName, processInfo.Arguments, process.Id)); process.Kill(); ! standardOutput.Abort(); // streams must be aborted after the process is killed -- otherwise there is a risk that the process will ! standardError.Abort(); // already be dead when process.Kill is invoked ! process.WaitForExit(); ! Log.Warning(string.Format("The timed out process has been killed: {0}", process.Id)); } + return new ProcessResult(standardOutput.Output, standardError.Output, process.ExitCode, ! hasExited); } } |