From c50a4f1987efaaecbad4793409c4e3d36fa2b868 Mon Sep 17 00:00:00 2001 From: Tyrrrz <1935960+Tyrrrz@users.noreply.github.com> Date: Tue, 4 Mar 2025 22:50:21 +0200 Subject: [PATCH 1/2] Don't set process priority unless instructed to --- CliWrap/Builders/ResourcePolicyBuilder.cs | 4 ++-- CliWrap/Command.Execution.cs | 5 +++-- CliWrap/ResourcePolicy.cs | 4 ++-- CliWrap/Utils/ProcessEx.cs | 20 +++++++++++++------- 4 files changed, 20 insertions(+), 13 deletions(-) diff --git a/CliWrap/Builders/ResourcePolicyBuilder.cs b/CliWrap/Builders/ResourcePolicyBuilder.cs index 8ee91807..ece07f67 100644 --- a/CliWrap/Builders/ResourcePolicyBuilder.cs +++ b/CliWrap/Builders/ResourcePolicyBuilder.cs @@ -7,7 +7,7 @@ namespace CliWrap.Builders; /// public class ResourcePolicyBuilder { - private ProcessPriorityClass _priority = ProcessPriorityClass.Normal; + private ProcessPriorityClass? _priority; private nint? _affinity; private nint? _minWorkingSet; private nint? _maxWorkingSet; @@ -15,7 +15,7 @@ public class ResourcePolicyBuilder /// /// Sets the priority class of the process. /// - public ResourcePolicyBuilder SetPriority(ProcessPriorityClass priority) + public ResourcePolicyBuilder SetPriority(ProcessPriorityClass? priority) { _priority = priority; return this; diff --git a/CliWrap/Command.Execution.cs b/CliWrap/Command.Execution.cs index bd106df2..4346fe89 100644 --- a/CliWrap/Command.Execution.cs +++ b/CliWrap/Command.Execution.cs @@ -317,7 +317,8 @@ CancellationToken gracefulCancellationToken { // Disable CA1416 because we're handling an exception that is thrown by the property setters #pragma warning disable CA1416 - p.PriorityClass = ResourcePolicy.Priority; + if (ResourcePolicy.Priority is not null) + p.PriorityClass = ResourcePolicy.Priority.Value; if (ResourcePolicy.Affinity is not null) p.ProcessorAffinity = ResourcePolicy.Affinity.Value; @@ -332,7 +333,7 @@ CancellationToken gracefulCancellationToken catch (NotSupportedException ex) { throw new NotSupportedException( - "Cannot set resource policy for the process. " + "Cannot start a process with the provided resource policy. " + "Setting custom priority, affinity, and/or working set limits is not supported on this platform.", ex ); diff --git a/CliWrap/ResourcePolicy.cs b/CliWrap/ResourcePolicy.cs index 943824b9..6b4c07f8 100644 --- a/CliWrap/ResourcePolicy.cs +++ b/CliWrap/ResourcePolicy.cs @@ -6,7 +6,7 @@ namespace CliWrap; /// Resource policy assigned to a process. /// public partial class ResourcePolicy( - ProcessPriorityClass priority = ProcessPriorityClass.Normal, + ProcessPriorityClass? priority = null, nint? affinity = null, nint? minWorkingSet = null, nint? maxWorkingSet = null @@ -15,7 +15,7 @@ public partial class ResourcePolicy( /// /// Priority class of the process. /// - public ProcessPriorityClass Priority { get; } = priority; + public ProcessPriorityClass? Priority { get; } = priority; /// /// Processor core affinity mask of the process. diff --git a/CliWrap/Utils/ProcessEx.cs b/CliWrap/Utils/ProcessEx.cs index 91ccc93a..008a7ed4 100644 --- a/CliWrap/Utils/ProcessEx.cs +++ b/CliWrap/Utils/ProcessEx.cs @@ -48,7 +48,10 @@ public void Start(Action? configureProcess = null) _nativeProcess.EnableRaisingEvents = true; _nativeProcess.Exited += (_, _) => { + // Record exit time ExitTime = DateTimeOffset.Now; + + // Release the waiting task _exitTcs.TrySetResult(null); }; @@ -59,23 +62,24 @@ public void Start(Action? configureProcess = null) { throw new InvalidOperationException( $"Failed to start a process with file path '{_nativeProcess.StartInfo.FileName}'. " - + "Target file is not an executable or lacks execute permissions." + + "Target file is not an executable or lacks the 'execute' permission." ); } - - StartTime = DateTimeOffset.Now; - - // Apply custom configurations - configureProcess?.Invoke(_nativeProcess); } catch (Win32Exception ex) { throw new Win32Exception( $"Failed to start a process with file path '{_nativeProcess.StartInfo.FileName}'. " - + "Target file or working directory doesn't exist, or the provided credentials are invalid.", + + "Target file or working directory doesn't exist, the provided credentials are invalid, or the resource policy cannot be set due to insufficient permissions.", ex ); } + + // Record start time + StartTime = DateTimeOffset.Now; + + // Apply custom configurations + configureProcess?.Invoke(_nativeProcess); } // Sends SIGINT @@ -148,7 +152,9 @@ public async Task WaitUntilExitAsync(CancellationToken cancellationToken = defau .Register(() => _exitTcs.TrySetCanceled(cancellationToken)) .ToAsyncDisposable() ) + { await _exitTcs.Task.ConfigureAwait(false); + } } public void Dispose() => _nativeProcess.Dispose(); From ff973a12ab60165e855004be0feeee0ad51ca4c1 Mon Sep 17 00:00:00 2001 From: Tyrrrz <1935960+Tyrrrz@users.noreply.github.com> Date: Tue, 4 Mar 2025 22:55:38 +0200 Subject: [PATCH 2/2] Improve exception message --- CliWrap/Utils/ProcessEx.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CliWrap/Utils/ProcessEx.cs b/CliWrap/Utils/ProcessEx.cs index 008a7ed4..ff9b9ac5 100644 --- a/CliWrap/Utils/ProcessEx.cs +++ b/CliWrap/Utils/ProcessEx.cs @@ -70,7 +70,8 @@ public void Start(Action? configureProcess = null) { throw new Win32Exception( $"Failed to start a process with file path '{_nativeProcess.StartInfo.FileName}'. " - + "Target file or working directory doesn't exist, the provided credentials are invalid, or the resource policy cannot be set due to insufficient permissions.", + + "Target file or working directory doesn't exist, the provided credentials are invalid, or the resource policy cannot be set due to insufficient permissions. " + + "See the inner exception for more information.", ex ); }