2 * When using the ProcessStartInfo.RedirectStandardXxx properties there is a chance of
3 * the parent and child process blocking due to a race condition. This class handles the
5 * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemdiagnosticsprocessstartinfoclassredirectstandardoutputtopic.asp
9 using System.Threading;
10 using System.Diagnostics;
12 namespace ReactOS.Verify
15 /// Process that redirects standard output and standard error streams.
17 public class RedirectableProcess
22 private Process process;
25 /// Redirected standard error stream.
27 private string processError;
30 /// Redirected standard output stream.
32 private string processOutput;
40 /// Redirected standard error stream.
42 public string ProcessError
51 /// Redirected standard output stream.
53 public string ProcessOutput
73 /// Run an excutable and redirect standard error and/or standard output safely.
75 public RedirectableProcess(ProcessStartInfo processStartInfo)
77 Run(processStartInfo, null);
81 /// Run an excutable and redirect standard error and/or standard output safely.
83 public RedirectableProcess(ProcessStartInfo processStartInfo, string input)
85 Run(processStartInfo, input);
88 private void Run(ProcessStartInfo processStartInfo, string input)
90 process = new Process();
91 process.StartInfo = processStartInfo;
93 if (processStartInfo.RedirectStandardInput && input != null)
95 process.StandardInput.AutoFlush = true;
96 process.StandardInput.WriteLine(input);
98 Thread readStandardError = null;
99 if (processStartInfo.RedirectStandardError)
101 readStandardError = new Thread(new ThreadStart(ReadStandardError));
102 readStandardError.Start();
104 Thread readStandardOutput = null;
105 if (processStartInfo.RedirectStandardOutput)
107 readStandardOutput = new Thread(new ThreadStart(ReadStandardOutput));
108 readStandardOutput.Start();
110 if (processStartInfo.RedirectStandardError)
112 readStandardError.Join();
114 if (processStartInfo.RedirectStandardOutput)
116 readStandardOutput.Join();
118 process.WaitForExit();
119 exitCode = process.ExitCode;
124 /// Read standard error thread entry-point.
126 private void ReadStandardError()
130 processError = process.StandardError.ReadToEnd();
135 /// Read standard output thread entry-point.
137 private void ReadStandardOutput()
141 processOutput = process.StandardOutput.ReadToEnd();