From b3764fffc1abe1717f996b47772c2ea5d1937fea Mon Sep 17 00:00:00 2001 From: lateralusX Date: Wed, 28 May 2025 13:18:00 +0200 Subject: [PATCH 1/5] Adjust test timeout to handle deviation due to lowres timers. --- .../baseservices/threading/regressions/115178/115178.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/tests/baseservices/threading/regressions/115178/115178.cs b/src/tests/baseservices/threading/regressions/115178/115178.cs index 0ad7a004945eab..bec9825fe186ba 100644 --- a/src/tests/baseservices/threading/regressions/115178/115178.cs +++ b/src/tests/baseservices/threading/regressions/115178/115178.cs @@ -165,9 +165,10 @@ private static void RunTestUsingTimedWait() stopwatch.Stop(); - if (stopwatch.ElapsedMilliseconds < 2000) + long elapsedMilliseconds = stopwatch.ElapsedMilliseconds; + if (elapsedMilliseconds < 2000) { - Console.WriteLine($"Error waiting on event, wait returned too early."); + Console.WriteLine($"Error waiting on event, wait returned too early. Waited {elapsedMilliseconds} ms, expected at least 2000 ms."); result = 5; } From 8e370ea84f0c842c4f26a8de3774fbc8b5dba207 Mon Sep 17 00:00:00 2001 From: lateralusX Date: Wed, 28 May 2025 14:54:05 +0200 Subject: [PATCH 2/5] Acceept 500 ms deviation on wait time. --- src/tests/baseservices/threading/regressions/115178/115178.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/tests/baseservices/threading/regressions/115178/115178.cs b/src/tests/baseservices/threading/regressions/115178/115178.cs index bec9825fe186ba..44edaf19850c85 100644 --- a/src/tests/baseservices/threading/regressions/115178/115178.cs +++ b/src/tests/baseservices/threading/regressions/115178/115178.cs @@ -166,9 +166,9 @@ private static void RunTestUsingTimedWait() stopwatch.Stop(); long elapsedMilliseconds = stopwatch.ElapsedMilliseconds; - if (elapsedMilliseconds < 2000) + if (elapsedMilliseconds < 1500) { - Console.WriteLine($"Error waiting on event, wait returned too early. Waited {elapsedMilliseconds} ms, expected at least 2000 ms."); + Console.WriteLine($"Error waiting on event, wait returned too early. Waited {elapsedMilliseconds} ms, expected at least 1500 ms."); result = 5; } From 047ec1016d7562eadce43ae4a5ee755a4a65c62d Mon Sep 17 00:00:00 2001 From: lateralusX Date: Tue, 3 Jun 2025 18:49:03 +0200 Subject: [PATCH 3/5] Reenable test. --- src/tests/issues.targets | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/tests/issues.targets b/src/tests/issues.targets index f618a5e5c2f9d6..49ffcb88a3453f 100644 --- a/src/tests/issues.targets +++ b/src/tests/issues.targets @@ -30,9 +30,6 @@ https://github.com/dotnet/runtime/issues/83658 - - https://github.com/dotnet/runtime/issues/116060 - https://github.com/dotnet/runtime/issues/5933 From 64ea11b87ce63b1b444f8c06f79ad4279712beb7 Mon Sep 17 00:00:00 2001 From: lateralusX Date: Tue, 29 Jul 2025 14:07:56 +0200 Subject: [PATCH 4/5] Adjust wait time calculation. --- src/coreclr/vm/threads.cpp | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/src/coreclr/vm/threads.cpp b/src/coreclr/vm/threads.cpp index 72a14b5a81b84d..3f47949b2c2e93 100644 --- a/src/coreclr/vm/threads.cpp +++ b/src/coreclr/vm/threads.cpp @@ -3309,12 +3309,12 @@ DWORD Thread::DoAppropriateWaitWorker(int countHandles, HANDLE *handles, BOOL wa } ULONGLONG dwStart = 0, dwEnd; -retry: if (millis != INFINITE) { dwStart = minipal_lowres_ticks(); } +retry: if (tryNonblockingWaitFirst) { // We have a final wait result from the nonblocking wait above @@ -3344,10 +3344,9 @@ DWORD Thread::DoAppropriateWaitWorker(int countHandles, HANDLE *handles, BOOL wa ret = WAIT_TIMEOUT; goto WaitCompleted; } - else - { - millis -= (DWORD)(dwEnd - dwStart); - } + + millis -= (DWORD)(dwEnd - dwStart); + dwStart = dwEnd; } goto retry; } @@ -3421,18 +3420,17 @@ DWORD Thread::DoAppropriateWaitWorker(int countHandles, HANDLE *handles, BOOL wa // Compute the new timeout value by assume that the timeout // is not large enough for more than one wrap - dwEnd = minipal_lowres_ticks(); if (millis != INFINITE) { + dwEnd = minipal_lowres_ticks(); if (dwEnd - dwStart >= millis) { ret = WAIT_TIMEOUT; goto WaitCompleted; } - else - { - millis -= (DWORD)(dwEnd - dwStart); - } + + millis -= (DWORD)(dwEnd - dwStart); + dwStart = dwEnd; } goto retry; } @@ -3574,11 +3572,9 @@ DWORD Thread::DoSignalAndWaitWorker(HANDLE* pHandles, DWORD millis,BOOL alertabl ret = WAIT_TIMEOUT; goto WaitCompleted; } - else - { - millis -= (DWORD)(dwEnd - dwStart); - } - dwStart = minipal_lowres_ticks(); + + millis -= (DWORD)(dwEnd - dwStart); + dwStart = dwEnd; } //Retry case we don't want to signal again so only do the wait... ret = WaitForSingleObjectEx(pHandles[1],millis,TRUE); From b1b16892441fbe875360aa8dba77c68b7e7c727f Mon Sep 17 00:00:00 2001 From: lateralusX Date: Tue, 29 Jul 2025 14:08:25 +0200 Subject: [PATCH 5/5] Reduce wait delta to 20ms to account for low vs high res timers. --- .../baseservices/threading/regressions/115178/115178.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/tests/baseservices/threading/regressions/115178/115178.cs b/src/tests/baseservices/threading/regressions/115178/115178.cs index 44edaf19850c85..3e8608e9102634 100644 --- a/src/tests/baseservices/threading/regressions/115178/115178.cs +++ b/src/tests/baseservices/threading/regressions/115178/115178.cs @@ -166,9 +166,10 @@ private static void RunTestUsingTimedWait() stopwatch.Stop(); long elapsedMilliseconds = stopwatch.ElapsedMilliseconds; - if (elapsedMilliseconds < 1500) + if (elapsedMilliseconds < 1980) { - Console.WriteLine($"Error waiting on event, wait returned too early. Waited {elapsedMilliseconds} ms, expected at least 1500 ms."); + // Wait uses low resolution timer, test includes a margin of 20ms to account for timer resolution differences. + Console.WriteLine($"Error waiting on event, wait returned too early. Waited {elapsedMilliseconds} ms, expected at least 1980 ms."); result = 5; }