From 28deedc03836d1ae8bd26227c5840b6c6b2781c4 Mon Sep 17 00:00:00 2001 From: Victor Nova Date: Mon, 23 May 2022 10:42:19 -0700 Subject: [PATCH] a hack to unconditionally kill ffmpeg when parent .NET process exits Former-commit-id: 5ac61011c48994870386e9cd3db649ba6cda753f --- FFMpegCore/Extend/Job.cs | 46 ++++++++++++++++++++ FFMpegCore/FFMpeg/FFMpegArgumentProcessor.cs | 15 ++++++- FFMpegCore/FFMpegCore.csproj | 1 + 3 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 FFMpegCore/Extend/Job.cs diff --git a/FFMpegCore/Extend/Job.cs b/FFMpegCore/Extend/Job.cs new file mode 100644 index 0000000..788bb79 --- /dev/null +++ b/FFMpegCore/Extend/Job.cs @@ -0,0 +1,46 @@ +using System; +using System.Runtime.InteropServices; + +using static PInvoke.Kernel32; + + +namespace FFMpegCore.Extend { + public class Job : IDisposable { + readonly SafeObjectHandle handle; + + public Job() { + this.handle = CreateJobObject(IntPtr.Zero, null); + + var info = new JOBOBJECT_BASIC_LIMIT_INFORMATION { + LimitFlags = JOB_OBJECT_LIMIT_FLAGS.JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE, + }; + + var extendedInfo = new JOBOBJECT_EXTENDED_LIMIT_INFORMATION { BasicLimitInformation = info }; + + int length = Marshal.SizeOf(typeof(JOBOBJECT_EXTENDED_LIMIT_INFORMATION)); + IntPtr extendedInfoPtr = Marshal.AllocHGlobal(length); + Marshal.StructureToPtr(extendedInfo, extendedInfoPtr, false); + + if (!SetInformationJobObject(this.handle, JOBOBJECTINFOCLASS.JobObjectExtendedLimitInformation, extendedInfoPtr, (uint)length)) + throw new System.ComponentModel.Win32Exception(); + } + + public bool AddProcess(SafeObjectHandle processHandle) { + return AssignProcessToJobObject(this.handle, processHandle); + } + + #region IDisposable Members + + public void Dispose() { + this.Dispose(true); + GC.SuppressFinalize(this); + } + + + private void Dispose(bool disposing) => this.Close(); + + public void Close() => this.handle.Close(); + + #endregion + } +} diff --git a/FFMpegCore/FFMpeg/FFMpegArgumentProcessor.cs b/FFMpegCore/FFMpeg/FFMpegArgumentProcessor.cs index 423f881..57b5d4d 100644 --- a/FFMpegCore/FFMpeg/FFMpegArgumentProcessor.cs +++ b/FFMpegCore/FFMpeg/FFMpegArgumentProcessor.cs @@ -9,6 +9,12 @@ using System.Threading; using System.Threading.Tasks; using FFMpegCore.Enums; +using FFMpegCore.Exceptions; +using FFMpegCore.Extend; +using FFMpegCore.Helpers; +using Instances; + +using PInvoke; namespace FFMpegCore { @@ -141,7 +147,14 @@ private async Task Process(ProcessArguments processArguments, Ca _ffMpegArguments.Pre(); - using var instance = processArguments.Start(); + using var instance = (ProcessInstance)processArguments.Start(); + + using var job = new Job(); + var processHack = (Process)typeof(ProcessInstance).GetField("_process", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance) + .GetValue(instance); + using var instanceHandle = new Kernel32.SafeObjectHandle(processHack.Handle, ownsHandle: false); + job.AddProcess(instanceHandle); + var cancelled = false; void OnCancelEvent(object sender, int timeout) { diff --git a/FFMpegCore/FFMpegCore.csproj b/FFMpegCore/FFMpegCore.csproj index ecd0b85..9c9aba6 100644 --- a/FFMpegCore/FFMpegCore.csproj +++ b/FFMpegCore/FFMpegCore.csproj @@ -17,6 +17,7 @@ +