fix: Fixes overflow in timer wheel add timer (#780)

This commit is contained in:
Kamron Batman 2021-09-12 14:00:48 -07:00 committed by GitHub
parent c2d8f7d913
commit 52dacec68f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -136,14 +136,17 @@ namespace Server
private static void AddTimer(Timer timer, long delay)
{
#if DEBUG_TIMERS
var originalDelay = delay
#endif
delay = Math.Max(0, delay);
var resolutionPowerOf2 = _tickRatePowerOf2;
for (var i = 0; i < _ringLayers; i++)
{
var resolution = 1 << resolutionPowerOf2;
var resolution = 1L << resolutionPowerOf2;
var nextResolutionPowerOf2 = resolutionPowerOf2 + _ringSizePowerOf2;
long max = 1 << nextResolutionPowerOf2;
var max = 1L << nextResolutionPowerOf2;
if (delay < max)
{
var remaining = delay & (resolution - 1);
@ -168,13 +171,18 @@ namespace Server
_rings[i][slot] = timer;
break;
return;
}
// The remaining amount until we turn this ring
delay -= resolution * (_ringSize - _ringIndexes[i]);
resolutionPowerOf2 = nextResolutionPowerOf2;
}
// TODO: Handle timers > 17yrs
#if DEBUG_TIMERS
logger.Error($"Timer is more than max duration. ({originalDelay})");
#endif
}
public static void DumpInfo(TextWriter tw)