Do a double operation first before cast to long (#4353)

This commit is contained in:
BDisp
2025-10-27 01:46:59 +00:00
committed by GitHub
parent a0979368cb
commit 1e32d5d5ce
2 changed files with 10 additions and 1 deletions

View File

@@ -55,7 +55,13 @@ public class TimedEvents : ITimedEvents
{
// Convert Stopwatch ticks to TimeSpan ticks (100-nanosecond units)
// Stopwatch.Frequency gives ticks per second, so we need to scale appropriately
return Stopwatch.GetTimestamp () * TimeSpan.TicksPerSecond / Stopwatch.Frequency;
// To avoid overflow, we perform the operation in double precision first and then cast to long.
var ticks = (long)((double)Stopwatch.GetTimestamp () * TimeSpan.TicksPerSecond / Stopwatch.Frequency);
// Ensure ticks is positive and not overflowed (very unlikely now)
Debug.Assert (ticks > 0);
return ticks;
}
/// <inheritdoc/>

View File

@@ -92,9 +92,12 @@ public class TimedEventsTests
return false;
});
Assert.True (timedEvents.Timeouts.Keys [0] > 0);
// Should execute on first RunTimers call
timedEvents.RunTimers ();
Assert.Empty (timedEvents.Timeouts);
Assert.True (executed);
}