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); diff --git a/src/tests/baseservices/threading/regressions/115178/115178.cs b/src/tests/baseservices/threading/regressions/115178/115178.cs index 0ad7a004945eab..3e8608e9102634 100644 --- a/src/tests/baseservices/threading/regressions/115178/115178.cs +++ b/src/tests/baseservices/threading/regressions/115178/115178.cs @@ -165,9 +165,11 @@ private static void RunTestUsingTimedWait() stopwatch.Stop(); - if (stopwatch.ElapsedMilliseconds < 2000) + long elapsedMilliseconds = stopwatch.ElapsedMilliseconds; + if (elapsedMilliseconds < 1980) { - Console.WriteLine($"Error waiting on event, wait returned too early."); + // 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; } 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