-
Notifications
You must be signed in to change notification settings - Fork 5.4k
Open
Description
- The API got re-approved in New Process APIs #125838 (comment)
- We can just move
Process.StartCoretoSafeProcessHandle.Start. - We should consider using process file descriptors when available on Unix (modern Linux and FreeBSD as long as FreeBSD does nto kill processes on close). But this may require braking changes due to
SafeWaitHandlerole inSafeProcessHandle.Unix.cs
Lines 20 to 48 in 44cd131
| // On Windows, SafeProcessHandle represents the actual OS handle for the process. | |
| // On Unix, there's no such concept. Instead, the implementation manufactures | |
| // a WaitHandle that it manually sets when the process completes; SafeProcessHandle | |
| // then just wraps that same WaitHandle instance. This allows consumers that use | |
| // Process.{Safe}Handle to initialize and use a WaitHandle to successfully use it on | |
| // Unix as well to wait for the process to complete. | |
| private readonly SafeWaitHandle? _handle; | |
| private readonly bool _releaseRef; | |
| internal SafeProcessHandle(int processId, SafeWaitHandle handle) : | |
| this(handle.DangerousGetHandle(), ownsHandle: true) | |
| { | |
| ProcessId = processId; | |
| _handle = handle; | |
| handle.DangerousAddRef(ref _releaseRef); | |
| } | |
| internal int ProcessId { get; } | |
| protected override bool ReleaseHandle() | |
| { | |
| if (_releaseRef) | |
| { | |
| Debug.Assert(_handle != null); | |
| _handle.DangerousRelease(); | |
| } | |
| return true; | |
| } |
It allows to create a SafeWaitHandle out of SafeProcessHandle.handle:
| mre.SetSafeWaitHandle(new SafeWaitHandle(useSafeHandle ? h.Process.SafeHandle.DangerousGetHandle() : h.Process.Handle, ownsHandle: false)); |
More context: dotnet/corefx#36199, #28773
cc @stephentoub (I don't have a solution right now, just letting you know that the handle could become a real handle on Linux and FreeBSD)
Reactions are currently unavailable