From 03b3d4307e30c74ba8a2826a753bf329b2488324 Mon Sep 17 00:00:00 2001 From: Aaron Robinson Date: Fri, 15 Jul 2022 07:45:15 -0700 Subject: [PATCH 1/2] Permit repeating WaitHandle of infinite timeout --- .../src/System/Threading/PortableThreadPool.WaitThread.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/libraries/System.Private.CoreLib/src/System/Threading/PortableThreadPool.WaitThread.cs b/src/libraries/System.Private.CoreLib/src/System/Threading/PortableThreadPool.WaitThread.cs index b9c18134346b01..ff944b29597c5b 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Threading/PortableThreadPool.WaitThread.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Threading/PortableThreadPool.WaitThread.cs @@ -373,7 +373,10 @@ private void QueueWaitCompletion(RegisteredWaitHandle registeredHandle, bool tim // If the handle is a repeating handle, set up the next call. Otherwise, remove it from the wait thread. if (registeredHandle.Repeating) { - registeredHandle.RestartTimeout(); + if (!registeredHandle.IsInfiniteTimeout) + { + registeredHandle.RestartTimeout(); + } } else { From 63222064fd6da4e486518d4bbab5fc74d8f94259 Mon Sep 17 00:00:00 2001 From: Aaron Robinson Date: Fri, 15 Jul 2022 10:11:23 -0700 Subject: [PATCH 2/2] Add test for repeating waithandle with infinite timeout --- .../tests/RegisteredWaitTests.cs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/libraries/System.Threading.ThreadPool/tests/RegisteredWaitTests.cs b/src/libraries/System.Threading.ThreadPool/tests/RegisteredWaitTests.cs index f985c1a7a521d6..0e3534c38704d4 100644 --- a/src/libraries/System.Threading.ThreadPool/tests/RegisteredWaitTests.cs +++ b/src/libraries/System.Threading.ThreadPool/tests/RegisteredWaitTests.cs @@ -126,6 +126,24 @@ public static void QueueRegisterPositiveAndFlowTest() false); waitForBackgroundWork(true); Assert.Equal(0, backgroundAsyncLocalValue); + + // Validate a repeating waithandle with infinite timeout. + registeredWaitHandle = + ThreadPool.UnsafeRegisterWaitForSingleObject( + registerWaitEvent, + (state, timedOut) => + { + commonBackgroundTest(true, () => + { + Assert.Same(obj, state); + Assert.False(timedOut); + }); + }, + obj, + -1, // Infinite + false); // Execute once + waitForBackgroundWork(true); + Assert.Equal(0, backgroundAsyncLocalValue); } [ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsThreadingSupported))]