summaryrefslogtreecommitdiff
path: root/src/vm/win32threadpool.cpp
diff options
context:
space:
mode:
authorKoundinya Veluri <kouvel@microsoft.com>2017-04-26 16:08:53 -0700
committerGitHub <noreply@github.com>2017-04-26 16:08:53 -0700
commitc55f023f542e63e93a300752432de7bcc4104b3b (patch)
tree7ae30f78ea2085cb32b9d30ceaa571aeae039486 /src/vm/win32threadpool.cpp
parent70d1535d208ef1af1f4b375586bb7ef7237860da (diff)
downloadcoreclr-c55f023f542e63e93a300752432de7bcc4104b3b.tar.gz
coreclr-c55f023f542e63e93a300752432de7bcc4104b3b.tar.bz2
coreclr-c55f023f542e63e93a300752432de7bcc4104b3b.zip
Fix timer callback time drift (#11220)
Fixes #6408: - The change to S.T.Timer is the actual fix, but fixed the timer firing on the thread pool timer thread similarly as well
Diffstat (limited to 'src/vm/win32threadpool.cpp')
-rw-r--r--src/vm/win32threadpool.cpp25
1 files changed, 20 insertions, 5 deletions
diff --git a/src/vm/win32threadpool.cpp b/src/vm/win32threadpool.cpp
index bc84762b06..a79656e745 100644
--- a/src/vm/win32threadpool.cpp
+++ b/src/vm/win32threadpool.cpp
@@ -4755,15 +4755,30 @@ DWORD ThreadpoolMgr::FireTimers()
timerInfo,
QUEUE_ONLY /* TimerInfo take care of deleting*/);
- timerInfo->FiringTime = currentTime+timerInfo->Period;
+ if (timerInfo->Period != 0 && timerInfo->Period != (ULONG)-1)
+ {
+ ULONG nextFiringTime = timerInfo->FiringTime + timerInfo->Period;
+ DWORD firingInterval;
+ if (TimeExpired(timerInfo->FiringTime, currentTime, nextFiringTime))
+ {
+ // Enough time has elapsed to fire the timer yet again. The timer is not able to keep up with the short
+ // period, have it fire 1 ms from now to avoid spinning without a delay.
+ timerInfo->FiringTime = currentTime + 1;
+ firingInterval = 1;
+ }
+ else
+ {
+ timerInfo->FiringTime = nextFiringTime;
+ firingInterval = TimeInterval(nextFiringTime, currentTime);
+ }
- if ((timerInfo->Period != 0) && (timerInfo->Period != (ULONG) -1) && (nextFiringInterval > timerInfo->Period))
- nextFiringInterval = timerInfo->Period;
+ if (firingInterval < nextFiringInterval)
+ nextFiringInterval = firingInterval;
+ }
}
-
else
{
- DWORD firingInterval = TimeInterval(timerInfo->FiringTime,currentTime);
+ DWORD firingInterval = TimeInterval(timerInfo->FiringTime, currentTime);
if (firingInterval < nextFiringInterval)
nextFiringInterval = firingInterval;
}