Skip to content

Commit 6a65903

Browse files
committed
fix DelayedDelete
1 parent 662a573 commit 6a65903

File tree

2 files changed

+37
-20
lines changed

2 files changed

+37
-20
lines changed

Intersect.Client.Framework/Gwen/Control/Base.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2587,7 +2587,10 @@ private static void RemoveChild(Base @this, Base child, bool dispose)
25872587
);
25882588
}
25892589
@this._children.Remove(child);
2590-
child.DelayedDelete();
2590+
if (dispose)
2591+
{
2592+
child.DelayedDelete();
2593+
}
25912594
@this._innerPanel = null;
25922595
}
25932596
catch (NullReferenceException)

Intersect.Client.Framework/Gwen/Control/Canvas.cs

Lines changed: 33 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using Intersect.Client.Framework.GenericClasses;
1+
using System.Diagnostics;
2+
using Intersect.Client.Framework.GenericClasses;
23
using Intersect.Client.Framework.Gwen.Anim;
34
using Intersect.Client.Framework.Gwen.DragDrop;
45
using Intersect.Client.Framework.Gwen.Input;
@@ -15,8 +16,7 @@ namespace Intersect.Client.Framework.Gwen.Control;
1516
/// </summary>
1617
public partial class Canvas : Base
1718
{
18-
19-
private readonly List<IDisposable> mDisposeQueue; // dictionary for faster access?
19+
private readonly List<IDisposable> _disposeQueue = [];
2020

2121
private Color mBackgroundColor;
2222

@@ -48,8 +48,6 @@ public Canvas(Skin.Base skin, string? name = default) : base(parent: null, name:
4848
ShouldDrawBackground = false;
4949
IsTabable = false;
5050
MouseInputEnabled = false;
51-
52-
mDisposeQueue = new List<IDisposable>();
5351
}
5452

5553
/// <summary>
@@ -241,29 +239,45 @@ private void DoThink()
241239
/// <param name="control">Control to delete.</param>
242240
public void AddDelayedDelete(Base control)
243241
{
244-
if (!mDisposeQueue.Contains(control))
242+
lock (_disposeQueue)
245243
{
246-
mDisposeQueue.Add(control);
247-
control.Parent?.RemoveChild(control, false);
248-
}
244+
if (!_disposeQueue.Contains(control))
245+
{
246+
_disposeQueue.Add(control);
247+
control.Parent?.RemoveChild(control, false);
249248
#if DEBUG
250-
else
251-
{
252-
throw new InvalidOperationException("Control deleted twice");
253-
}
249+
_delayedDeleteStackTraces.Add(control, new StackTrace());
250+
}
251+
else
252+
{
253+
throw new InvalidOperationException("Control deleted twice");
254254
#endif
255+
}
256+
}
255257
}
256258

259+
#if DEBUG
260+
private readonly Dictionary<Base, StackTrace> _delayedDeleteStackTraces = [];
261+
#endif
262+
257263
private void ProcessDelayedDeletes()
258264
{
259-
//if (m_DisposeQueue.Count > 0)
260-
// System.Diagnostics.//debug.print("Canvas.ProcessDelayedDeletes: {0} items", m_DisposeQueue.Count);
261-
foreach (var control in mDisposeQueue)
265+
lock (_disposeQueue)
262266
{
263-
control.Dispose();
264-
}
267+
foreach (var control in _disposeQueue)
268+
{
269+
#if DEBUG
270+
if (control is Base node)
271+
{
272+
_delayedDeleteStackTraces.Remove(node);
273+
}
274+
#endif
265275

266-
mDisposeQueue.Clear();
276+
control.Dispose();
277+
}
278+
279+
_disposeQueue.Clear();
280+
}
267281
}
268282

269283
/// <summary>

0 commit comments

Comments
 (0)