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