#develop (short for SharpDevelop) is a free IDE for .NET programming languages.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

140 lines
3.7 KiB

// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using ICSharpCode.Profiler.Controller;
using ICSharpCode.Profiler.Controller.Data;
using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Workbench;
namespace ICSharpCode.Profiler.AddIn
{
/// <summary>
/// Description of ProfilerProcessRunner.
/// </summary>
public class ProfilerProcessRunner : IProcessRunner
{
ProcessStartInfo psi;
ProfilerRunner profilerRunner;
Process runningProcess;
IProfilingDataWriter writer;
ProfilerOptions options;
readonly object lockObj = new object();
bool wasStarted;
public ProfilerProcessRunner(IProfilingDataWriter writer, ProfilerOptions options)
{
if (writer == null)
throw new ArgumentNullException("writer");
if (options == null)
throw new ArgumentNullException("options");
this.writer = writer;
this.options = options;
this.psi = new ProcessStartInfo();
wasStarted = false;
}
public Task<int> RunInOutputPadAsync(IOutputCategory outputCategory, string program, params string[] arguments)
{
throw new NotImplementedException();
}
public void Start(string program, params string[] arguments)
{
lock (lockObj) {
if (wasStarted)
throw new InvalidOperationException();
profilerRunner = new ProfilerRunner(psi, true, writer);
profilerRunner.RunFinished += delegate { hasExited = true; };
runningProcess = profilerRunner.Run();
wasStarted = true;
}
}
public void StartCommandLine(string commandLine)
{
string[] args = ProcessRunner.CommandLineToArgumentArray(commandLine);
Start(args.FirstOrDefault() ?? "", args.Skip(1).ToArray());
}
public void Kill()
{
profilerRunner.Stop();
}
TaskCompletionSource<object> waitForExitTCS;
bool hasExited;
public Task WaitForExitAsync()
{
if (hasExited)
return Task.FromResult(true);
if (!wasStarted)
throw new InvalidOperationException("Process was not yet started");
lock (lockObj) {
if (waitForExitTCS != null) {
waitForExitTCS = new TaskCompletionSource<object>();
profilerRunner.RunFinished += delegate { waitForExitTCS.SetResult(null); };
}
}
return waitForExitTCS.Task;
}
public StreamReader OpenStandardOutputReader()
{
return runningProcess.StandardOutput;
}
public StreamReader OpenStandardErrorReader()
{
return runningProcess.StandardError;
}
public string WorkingDirectory {
get { return psi.WorkingDirectory; }
set { psi.WorkingDirectory = value; }
}
public ProcessCreationFlags CreationFlags { get; set; }
public IDictionary<string, string> EnvironmentVariables { get; set; }
public bool RedirectStandardOutput { get; set; }
public bool RedirectStandardError { get; set; }
public bool RedirectStandardOutputAndErrorToSingleStream { get; set; }
public Stream StandardOutput {
get {
if (runningProcess == null)
throw new InvalidOperationException("Cannot access StdOut of process, because it is not yet started!");
return null;//runningProcess.StandardOutput;
}
}
public Stream StandardError {
get {
if (runningProcess == null)
throw new InvalidOperationException("Cannot access StdErr of process, because it is not yet started!");
return null;//runningProcess.StandardError;
}
}
bool disposed = false;
public void Dispose()
{
if (!disposed) {
profilerRunner.Dispose();
disposed = true;
}
}
}
}