diff --git a/Dalamud/Interface/Internal/Windows/DataWindow.cs b/Dalamud/Interface/Internal/Windows/DataWindow.cs index 7d24198e7..4128d41d3 100644 --- a/Dalamud/Interface/Internal/Windows/DataWindow.cs +++ b/Dalamud/Interface/Internal/Windows/DataWindow.cs @@ -1564,6 +1564,8 @@ namespace Dalamud.Interface.Internal.Windows if (ImGui.CollapsingHeader($"#{task.Id} - {task.Status} {(subTime - task.StartTime).TotalMilliseconds}ms###task{i}")) { + task.IsBeingViewed = true; + if (ImGui.Button("CANCEL (May not work)")) { try @@ -1589,6 +1591,10 @@ namespace Dalamud.Interface.Internal.Windows ImGui.TextUnformatted(task.Exception.ToString()); } } + else + { + task.IsBeingViewed = false; + } ImGui.PopStyleColor(1); } diff --git a/Dalamud/Logging/Internal/TaskTracker.cs b/Dalamud/Logging/Internal/TaskTracker.cs index fb99498a2..3888d55db 100644 --- a/Dalamud/Logging/Internal/TaskTracker.cs +++ b/Dalamud/Logging/Internal/TaskTracker.cs @@ -15,6 +15,7 @@ namespace Dalamud.Logging.Internal /// internal class TaskTracker : IDisposable { + private static readonly ModuleLog Log = new("TT"); private static readonly List TrackedTasksInternal = new(); private static readonly ConcurrentQueue NewlyCreatedTasks = new(); private static bool clearRequested = false; @@ -53,12 +54,33 @@ namespace Dalamud.Logging.Internal clearRequested = false; } + var i = 0; + var pruned = 0; + // Prune old tasks. Technically a memory "leak" that grows infinitely otherwise. + while (i < TrackedTasksInternal.Count) + { + var taskInfo = TrackedTasksInternal[i]; + if (taskInfo.IsCompleted && !taskInfo.IsBeingViewed && TrackedTasksInternal.Count > 1000) + { + TrackedTasksInternal.RemoveAt(i); + pruned++; + continue; + } + + i++; + } + + // if (pruned > 0) + // Log.Debug($"Pruned {pruned} tasks"); + + // Consume from a queue to prevent iteration errors while (NewlyCreatedTasks.TryDequeue(out var newTask)) { TrackedTasksInternal.Add(newTask); } - for (var i = 0; i < TrackedTasksInternal.Count; i++) + // Update each task + for (i = 0; i < TrackedTasksInternal.Count; i++) { var taskInfo = TrackedTasksInternal[i]; if (taskInfo.Task == null) @@ -179,6 +201,11 @@ namespace Dalamud.Logging.Internal /// public bool IsCompletedSuccessfully { get; set; } + /// + /// Gets or sets a value indicating whether this task is being viewed. + /// + public bool IsBeingViewed { get; set; } + /// /// Gets or sets the status of the task. ///