From b81cb448a90a63b7e58383696bcb3c91df5c6c8d Mon Sep 17 00:00:00 2001 From: Rodrigo Date: Fri, 2 Oct 2026 06:19:57 -0600 Subject: [PATCH] Fix OS-level thread priority degradation in InProcess executors --- .../InProcess/Emit/InProcessEmitExecutor.cs | 12 ++++++++---- .../InProcess/NoEmit/InProcessNoEmitExecutor.cs | 12 ++++++++---- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/BenchmarkDotNet/Toolchains/InProcess/Emit/InProcessEmitExecutor.cs b/src/BenchmarkDotNet/Toolchains/InProcess/Emit/InProcessEmitExecutor.cs index 588013cef0..1c71f58841 100644 --- a/src/BenchmarkDotNet/Toolchains/InProcess/Emit/InProcessEmitExecutor.cs +++ b/src/BenchmarkDotNet/Toolchains/InProcess/Emit/InProcessEmitExecutor.cs @@ -70,10 +70,12 @@ private async ValueTask ExecuteCore(IHost host, ExecuteParameters parameter var oldThreadPriority = thread.Priority; var affinity = parameters.BenchmarkCase.Job.ResolveValueAsNullable(EnvironmentMode.AffinityCharacteristic); + bool processPrioritySet = false; + bool threadPrioritySet = false; try { - process.TrySetPriority(ProcessPriorityClass.High, parameters.Logger); - thread.TrySetPriority(ThreadPriority.Highest, parameters.Logger); + processPrioritySet = process.TrySetPriority(ProcessPriorityClass.High, parameters.Logger); + threadPrioritySet = thread.TrySetPriority(ThreadPriority.Highest, parameters.Logger); if (affinity != null) { @@ -88,8 +90,10 @@ private async ValueTask ExecuteCore(IHost host, ExecuteParameters parameter } finally { - process.TrySetPriority(oldPriority, parameters.Logger); - thread.TrySetPriority(oldThreadPriority, parameters.Logger); + if (processPrioritySet) + process.TrySetPriority(oldPriority, parameters.Logger); + if (threadPrioritySet) + thread.TrySetPriority(oldThreadPriority, parameters.Logger); if (affinity != null && oldAffinity != null) { diff --git a/src/BenchmarkDotNet/Toolchains/InProcess/NoEmit/InProcessNoEmitExecutor.cs b/src/BenchmarkDotNet/Toolchains/InProcess/NoEmit/InProcessNoEmitExecutor.cs index 640c4c92e2..bfb2431642 100644 --- a/src/BenchmarkDotNet/Toolchains/InProcess/NoEmit/InProcessNoEmitExecutor.cs +++ b/src/BenchmarkDotNet/Toolchains/InProcess/NoEmit/InProcessNoEmitExecutor.cs @@ -71,10 +71,12 @@ private async ValueTask ExecuteCore(IHost host, ExecuteParameters parameter var oldThreadPriority = thread.Priority; var affinity = parameters.BenchmarkCase.Job.ResolveValueAsNullable(EnvironmentMode.AffinityCharacteristic); + bool processPrioritySet = false; + bool threadPrioritySet = false; try { - process.TrySetPriority(ProcessPriorityClass.High, parameters.Logger); - thread.TrySetPriority(ThreadPriority.Highest, parameters.Logger); + processPrioritySet = process.TrySetPriority(ProcessPriorityClass.High, parameters.Logger); + threadPrioritySet = thread.TrySetPriority(ThreadPriority.Highest, parameters.Logger); if (affinity != null) { @@ -89,8 +91,10 @@ private async ValueTask ExecuteCore(IHost host, ExecuteParameters parameter } finally { - process.TrySetPriority(oldPriority, parameters.Logger); - thread.TrySetPriority(oldThreadPriority, parameters.Logger); + if (processPrioritySet) + process.TrySetPriority(oldPriority, parameters.Logger); + if (threadPrioritySet) + thread.TrySetPriority(oldThreadPriority, parameters.Logger); if (affinity != null && oldAffinity != null) {