From 90ae73057ef213f8c163233f7c68e69419a23828 Mon Sep 17 00:00:00 2001 From: Syrone Wong Date: Tue, 11 Oct 2016 17:00:19 +0800 Subject: [PATCH] Misc Signed-off-by: Syrone Wong --- shadowsocks-csharp/Util/ProcessManagement/Job.cs | 76 +++++++++++++----------- 1 file changed, 41 insertions(+), 35 deletions(-) diff --git a/shadowsocks-csharp/Util/ProcessManagement/Job.cs b/shadowsocks-csharp/Util/ProcessManagement/Job.cs index 02646064..dd82134d 100644 --- a/shadowsocks-csharp/Util/ProcessManagement/Job.cs +++ b/shadowsocks-csharp/Util/ProcessManagement/Job.cs @@ -11,21 +11,7 @@ namespace Shadowsocks.Util.ProcessManagement */ public class Job : IDisposable { - [DllImport("kernel32.dll", CharSet = CharSet.Unicode)] - private static extern IntPtr CreateJobObject(IntPtr a, string lpName); - - [DllImport("kernel32.dll", SetLastError = true)] - private static extern bool SetInformationJobObject(IntPtr hJob, JobObjectInfoType infoType, IntPtr lpJobObjectInfo, UInt32 cbJobObjectInfoLength); - - [DllImport("kernel32.dll", SetLastError = true)] - private static extern bool AssignProcessToJobObject(IntPtr job, IntPtr process); - - [DllImport("kernel32.dll", SetLastError = true)] - [return: MarshalAs(UnmanagedType.Bool)] - private static extern bool CloseHandle(IntPtr hObject); - private IntPtr handle = IntPtr.Zero; - private bool disposed; public Job() { @@ -62,24 +48,43 @@ namespace Shadowsocks.Util.ProcessManagement } } + public bool AddProcess(IntPtr processHandle) + { + var succ = AssignProcessToJobObject(handle, processHandle); + + if (!succ) + { + Logging.Error("Failed to call AssignProcessToJobObject! GetLastError=" + Marshal.GetLastWin32Error()); + } + + return succ; + } + + public bool AddProcess(int processId) + { + return AddProcess(Process.GetProcessById(processId).Handle); + } + + #region IDisposable + + private bool disposed; + public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } - private void Dispose(bool disposing) + protected virtual void Dispose(bool disposing) { if (disposed) return; disposed = true; - if (disposing) { } - - Close(); - } + if (disposing) + { + // no managed objects to free + } - private void Close() - { if (handle != IntPtr.Zero) { CloseHandle(handle); @@ -87,28 +92,29 @@ namespace Shadowsocks.Util.ProcessManagement } } - ~Job() + ~Job() { Dispose(false); } - public bool AddProcess(IntPtr processHandle) - { - var succ = AssignProcessToJobObject(handle, processHandle); + #endregion - if (!succ) - { - Logging.Error("Failed to call AssignProcessToJobObject! GetLastError=" + Marshal.GetLastWin32Error()); - } + #region Interop + + [DllImport("kernel32.dll", CharSet = CharSet.Unicode)] + private static extern IntPtr CreateJobObject(IntPtr a, string lpName); - return succ; - } + [DllImport("kernel32.dll", SetLastError = true)] + private static extern bool SetInformationJobObject(IntPtr hJob, JobObjectInfoType infoType, IntPtr lpJobObjectInfo, UInt32 cbJobObjectInfoLength); - public bool AddProcess(int processId) - { - return AddProcess(Process.GetProcessById(processId).Handle); - } + [DllImport("kernel32.dll", SetLastError = true)] + private static extern bool AssignProcessToJobObject(IntPtr job, IntPtr process); + + [DllImport("kernel32.dll", SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + private static extern bool CloseHandle(IntPtr hObject); + #endregion } #region Helper classes