mirror of
https://github.com/microsoft/terminal.git
synced 2025-12-19 18:11:39 -05:00
move Process and ProcessFactory classes into separate files
This commit is contained in:
@@ -45,7 +45,8 @@
|
|||||||
<Compile Include="Native\ConsoleApi.cs" />
|
<Compile Include="Native\ConsoleApi.cs" />
|
||||||
<Compile Include="Native\ProcessApi.cs" />
|
<Compile Include="Native\ProcessApi.cs" />
|
||||||
<Compile Include="Native\PseudoConsoleApi.cs" />
|
<Compile Include="Native\PseudoConsoleApi.cs" />
|
||||||
<Compile Include="Process.cs" />
|
<Compile Include="Processes\Process.cs" />
|
||||||
|
<Compile Include="Processes\ProcessFactory.cs" />
|
||||||
<Compile Include="Program.cs" />
|
<Compile Include="Program.cs" />
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
<Compile Include="PseudoConsole.cs" />
|
<Compile Include="PseudoConsole.cs" />
|
||||||
|
|||||||
74
samples/ConPTY/MiniTerm/MiniTerm/Processes/Process.cs
Normal file
74
samples/ConPTY/MiniTerm/MiniTerm/Processes/Process.cs
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
using System;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
using static MiniTerm.Native.ProcessApi;
|
||||||
|
|
||||||
|
namespace MiniTerm
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Represents an instance of a process.
|
||||||
|
/// </summary>
|
||||||
|
internal sealed class Process : IDisposable
|
||||||
|
{
|
||||||
|
public Process(STARTUPINFOEX startupInfo, PROCESS_INFORMATION processInfo)
|
||||||
|
{
|
||||||
|
StartupInfo = startupInfo;
|
||||||
|
ProcessInfo = processInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
public STARTUPINFOEX StartupInfo { get; }
|
||||||
|
public PROCESS_INFORMATION ProcessInfo { get; }
|
||||||
|
|
||||||
|
#region IDisposable Support
|
||||||
|
|
||||||
|
private bool disposedValue = false; // To detect redundant calls
|
||||||
|
|
||||||
|
void Dispose(bool disposing)
|
||||||
|
{
|
||||||
|
if (!disposedValue)
|
||||||
|
{
|
||||||
|
if (disposing)
|
||||||
|
{
|
||||||
|
// dispose managed state (managed objects).
|
||||||
|
}
|
||||||
|
|
||||||
|
// dispose unmanaged state
|
||||||
|
|
||||||
|
// Free the attribute list
|
||||||
|
if (StartupInfo.lpAttributeList != IntPtr.Zero)
|
||||||
|
{
|
||||||
|
DeleteProcThreadAttributeList(StartupInfo.lpAttributeList);
|
||||||
|
Marshal.FreeHGlobal(StartupInfo.lpAttributeList);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Close process and thread handles
|
||||||
|
if (ProcessInfo.hProcess != IntPtr.Zero)
|
||||||
|
{
|
||||||
|
CloseHandle(ProcessInfo.hProcess);
|
||||||
|
}
|
||||||
|
if (ProcessInfo.hThread != IntPtr.Zero)
|
||||||
|
{
|
||||||
|
CloseHandle(ProcessInfo.hThread);
|
||||||
|
}
|
||||||
|
|
||||||
|
disposedValue = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
~Process()
|
||||||
|
{
|
||||||
|
// Do not change this code. Put cleanup code in Dispose(bool disposing) above.
|
||||||
|
Dispose(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
// This code added to correctly implement the disposable pattern.
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
// Do not change this code. Put cleanup code in Dispose(bool disposing) above.
|
||||||
|
Dispose(true);
|
||||||
|
// use the following line if the finalizer is overridden above.
|
||||||
|
GC.SuppressFinalize(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -24,6 +24,8 @@ namespace MiniTerm
|
|||||||
|
|
||||||
private static STARTUPINFOEX ConfigureProcessThread(IntPtr hPC, IntPtr attributes)
|
private static STARTUPINFOEX ConfigureProcessThread(IntPtr hPC, IntPtr attributes)
|
||||||
{
|
{
|
||||||
|
// this method implements the behavior described in https://docs.microsoft.com/en-us/windows/console/creating-a-pseudoconsole-session#preparing-for-creation-of-the-child-process
|
||||||
|
|
||||||
var lpSize = IntPtr.Zero;
|
var lpSize = IntPtr.Zero;
|
||||||
var success = InitializeProcThreadAttributeList(
|
var success = InitializeProcThreadAttributeList(
|
||||||
lpAttributeList: IntPtr.Zero,
|
lpAttributeList: IntPtr.Zero,
|
||||||
@@ -93,72 +95,4 @@ namespace MiniTerm
|
|||||||
return pInfo;
|
return pInfo;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Represents an instance of a process
|
|
||||||
/// </summary>
|
|
||||||
internal sealed class Process : IDisposable
|
|
||||||
{
|
|
||||||
public Process(STARTUPINFOEX startupInfo, PROCESS_INFORMATION processInfo)
|
|
||||||
{
|
|
||||||
StartupInfo = startupInfo;
|
|
||||||
ProcessInfo = processInfo;
|
|
||||||
}
|
|
||||||
|
|
||||||
public STARTUPINFOEX StartupInfo { get; }
|
|
||||||
public PROCESS_INFORMATION ProcessInfo { get; }
|
|
||||||
|
|
||||||
#region IDisposable Support
|
|
||||||
|
|
||||||
private bool disposedValue = false; // To detect redundant calls
|
|
||||||
|
|
||||||
void Dispose(bool disposing)
|
|
||||||
{
|
|
||||||
if (!disposedValue)
|
|
||||||
{
|
|
||||||
if (disposing)
|
|
||||||
{
|
|
||||||
// dispose managed state (managed objects).
|
|
||||||
}
|
|
||||||
|
|
||||||
// dispose unmanaged state
|
|
||||||
|
|
||||||
// Free the attribute list
|
|
||||||
if (StartupInfo.lpAttributeList != IntPtr.Zero)
|
|
||||||
{
|
|
||||||
DeleteProcThreadAttributeList(StartupInfo.lpAttributeList);
|
|
||||||
Marshal.FreeHGlobal(StartupInfo.lpAttributeList);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Close process and thread handles
|
|
||||||
if (ProcessInfo.hProcess != IntPtr.Zero)
|
|
||||||
{
|
|
||||||
CloseHandle(ProcessInfo.hProcess);
|
|
||||||
}
|
|
||||||
if (ProcessInfo.hThread != IntPtr.Zero)
|
|
||||||
{
|
|
||||||
CloseHandle(ProcessInfo.hThread);
|
|
||||||
}
|
|
||||||
|
|
||||||
disposedValue = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
~Process()
|
|
||||||
{
|
|
||||||
// Do not change this code. Put cleanup code in Dispose(bool disposing) above.
|
|
||||||
Dispose(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
// This code added to correctly implement the disposable pattern.
|
|
||||||
public void Dispose()
|
|
||||||
{
|
|
||||||
// Do not change this code. Put cleanup code in Dispose(bool disposing) above.
|
|
||||||
Dispose(true);
|
|
||||||
// use the following line if the finalizer is overridden above.
|
|
||||||
GC.SuppressFinalize(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -112,10 +112,10 @@ namespace MiniTerm
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Get an AutoResetEvent that signals when the process exits
|
/// Get an AutoResetEvent that signals when the process exits
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private static AutoResetEvent WaitForExit(ProcessFactory.Process process) =>
|
private static AutoResetEvent WaitForExit(Process process) =>
|
||||||
new AutoResetEvent(false)
|
new AutoResetEvent(false)
|
||||||
{
|
{
|
||||||
SafeWaitHandle = new SafeWaitHandle(process.ProcessInfo.hProcess, false)
|
SafeWaitHandle = new SafeWaitHandle(process.ProcessInfo.hProcess, ownsHandle: false)
|
||||||
};
|
};
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
Reference in New Issue
Block a user