diff --git a/src/Libs/GObject-2.0/Internal/InstanceCache.cs b/src/Libs/GObject-2.0/Internal/InstanceCache.cs index bfedbfc6d..2c34e7020 100644 --- a/src/Libs/GObject-2.0/Internal/InstanceCache.cs +++ b/src/Libs/GObject-2.0/Internal/InstanceCache.cs @@ -56,8 +56,11 @@ public static unsafe void Remove(IntPtr handle) { lock (Cache) { - if (Cache.Remove(handle)) + if (Cache.Remove(handle, out var toggleRef)) + { + toggleRef.Dispose(); ToggleRegistration.RemoveToggleRef(handle, &ToggleNotify); + } } Debug.WriteLine($"Handle {handle}: Removed object from {nameof(InstanceCache)}."); diff --git a/src/Libs/GObject-2.0/Internal/ToggleRef.cs b/src/Libs/GObject-2.0/Internal/ToggleRef.cs index f1747e346..f7b1381d4 100644 --- a/src/Libs/GObject-2.0/Internal/ToggleRef.cs +++ b/src/Libs/GObject-2.0/Internal/ToggleRef.cs @@ -2,14 +2,18 @@ namespace GObject.Internal; -internal class ToggleRef +internal class ToggleRef : IDisposable { private object _reference; + private bool _disposed; public GObject.Object? Object { get { + if (!_disposed) + return null; + if (_reference is WeakReference weakRef) return (GObject.Object?) weakRef.Target; @@ -31,6 +35,9 @@ public ToggleRef(GObject.Object obj) internal void ToggleReference(bool isLastRef) { + if (_disposed) + return; + if (!isLastRef && _reference is WeakReference weakRef) { if (weakRef.Target is { } weakObj) @@ -43,4 +50,9 @@ internal void ToggleReference(bool isLastRef) _reference = new WeakReference(_reference); } } + + public void Dispose() + { + _disposed = true; + } }