From d38b4905487aeee7ca7db746820e5a9b4806414e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Strehovsk=C3=BD?= Date: Tue, 2 Sep 2025 15:38:03 +0200 Subject: [PATCH 1/2] Add a lock to GetNewThunksBlock Fixes #116089. The method accesses shared static state, locking is needed. --- .../System.Private.CoreLib/src/System/Runtime/ThunkPool.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/coreclr/nativeaot/System.Private.CoreLib/src/System/Runtime/ThunkPool.cs b/src/coreclr/nativeaot/System.Private.CoreLib/src/System/Runtime/ThunkPool.cs index 429513459ce250..808acdbc43684a 100644 --- a/src/coreclr/nativeaot/System.Private.CoreLib/src/System/Runtime/ThunkPool.cs +++ b/src/coreclr/nativeaot/System.Private.CoreLib/src/System/Runtime/ThunkPool.cs @@ -36,6 +36,7 @@ using System.Diagnostics; using System.Numerics; +using System.Threading; namespace System.Runtime { @@ -293,9 +294,12 @@ internal static class ThunkBlocks { private static IntPtr[] s_currentlyMappedThunkBlocks = new IntPtr[Constants.NumThunkBlocksPerMapping]; private static int s_currentlyMappedThunkBlocksIndex = Constants.NumThunkBlocksPerMapping; + private static Lock s_lock = new Lock(); public static unsafe IntPtr GetNewThunksBlock() { + using Lock.Scope scope = s_lock.EnterScope(); + IntPtr nextThunksBlock; // Check the most recently mapped thunks block. Each mapping consists of multiple From 516bc84cea47cd45c28ad5d0846ef9e4116ffecc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Strehovsk=C3=BD?= Date: Tue, 2 Sep 2025 22:05:49 -0700 Subject: [PATCH 2/2] Update src/coreclr/nativeaot/System.Private.CoreLib/src/System/Runtime/ThunkPool.cs Co-authored-by: Jan Kotas --- .../System.Private.CoreLib/src/System/Runtime/ThunkPool.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/coreclr/nativeaot/System.Private.CoreLib/src/System/Runtime/ThunkPool.cs b/src/coreclr/nativeaot/System.Private.CoreLib/src/System/Runtime/ThunkPool.cs index 808acdbc43684a..29767cdcf9d00d 100644 --- a/src/coreclr/nativeaot/System.Private.CoreLib/src/System/Runtime/ThunkPool.cs +++ b/src/coreclr/nativeaot/System.Private.CoreLib/src/System/Runtime/ThunkPool.cs @@ -294,7 +294,7 @@ internal static class ThunkBlocks { private static IntPtr[] s_currentlyMappedThunkBlocks = new IntPtr[Constants.NumThunkBlocksPerMapping]; private static int s_currentlyMappedThunkBlocksIndex = Constants.NumThunkBlocksPerMapping; - private static Lock s_lock = new Lock(); + private static Lock s_lock = new Lock(useTrivialWaits: true); public static unsafe IntPtr GetNewThunksBlock() {