Merge pull request #1692 from tznind/fix-timeout-add-key-conflict

Fixed RunTimers not checking for key collisions in list when adding to timeouts
This commit is contained in:
Tig Kindel
2022-05-05 15:08:59 -07:00
committed by GitHub

View File

@@ -120,10 +120,7 @@ namespace Terminal.Gui {
{
lock (timeoutsLockToken) {
var k = (DateTime.UtcNow + time).Ticks;
while (timeouts.ContainsKey (k)) {
k = (DateTime.UtcNow + time).Ticks;
}
timeouts.Add (k, timeout);
timeouts.Add (NudgeToUniqueKey(k), timeout);
}
}
@@ -191,13 +188,30 @@ namespace Terminal.Gui {
AddTimeout (timeout.Span, timeout);
} else {
lock (timeoutsLockToken) {
timeouts.Add (k, timeout);
timeouts.Add (NudgeToUniqueKey(k), timeout);
}
}
}
}
/// <summary>
/// Finds the closest number to <paramref name="k"/> that is not
/// present in <see cref="timeouts"/> (incrementally).
/// </summary>
/// <param name="k"></param>
/// <returns></returns>
private long NudgeToUniqueKey (long k)
{
lock(timeoutsLockToken) {
while (timeouts.ContainsKey (k)) {
k++;
}
}
return k;
}
void RunIdle ()
{
List<Func<bool>> iterate;