Quellcode durchsuchen

Fixed RunTimers not checking for key collisions in list when adding to timeouts

Thomas Nind vor 3 Jahren
Ursprung
Commit
2785834805
1 geänderte Dateien mit 19 neuen und 5 gelöschten Zeilen
  1. 19 5
      Terminal.Gui/Core/MainLoop.cs

+ 19 - 5
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);
 					}
 				}
 			}
 			
 		}
 
+		/// <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;