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
);
}