From 27858348057146351c38387d7cf91fa82650ddf6 Mon Sep 17 00:00:00 2001 From: Thomas Nind Date: Wed, 4 May 2022 11:49:30 +0100 Subject: [PATCH] Fixed RunTimers not checking for key collisions in list when adding to timeouts --- Terminal.Gui/Core/MainLoop.cs | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/Terminal.Gui/Core/MainLoop.cs b/Terminal.Gui/Core/MainLoop.cs index 7c4076eec..493e3be48 100644 --- a/Terminal.Gui/Core/MainLoop.cs +++ b/Terminal.Gui/Core/MainLoop.cs @@ -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); } } } } + /// + /// Finds the closest number to that is not + /// present in (incrementally). + /// + /// + /// + private long NudgeToUniqueKey (long k) + { + lock(timeoutsLockToken) { + while (timeouts.ContainsKey (k)) { + k++; + } + } + + return k; + } + void RunIdle () { List> iterate;