From 3d6b4a875bb6c5adb24c49dd3dea159cd0f376e1 Mon Sep 17 00:00:00 2001 From: Dariusz Komosinski Date: Thu, 21 Feb 2019 14:34:24 +0100 Subject: [PATCH 1/2] Do not capture this when creating _drawOperationsRefCounter. --- .../Rendering/SceneGraph/VisualNode.cs | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/src/Avalonia.Visuals/Rendering/SceneGraph/VisualNode.cs b/src/Avalonia.Visuals/Rendering/SceneGraph/VisualNode.cs index 2fb8e84a2e..71e364ffc9 100644 --- a/src/Avalonia.Visuals/Rendering/SceneGraph/VisualNode.cs +++ b/src/Avalonia.Visuals/Rendering/SceneGraph/VisualNode.cs @@ -327,31 +327,36 @@ namespace Avalonia.Rendering.SceneGraph if (_drawOperations == null) { _drawOperations = new List>(); - _drawOperationsRefCounter = RefCountable.Create(Disposable.Create(DisposeDrawOperations)); + _drawOperationsRefCounter = RefCountable.Create(CreateDisposeDrawOperations(_drawOperations)); _drawOperationsCloned = false; } else if (_drawOperationsCloned) { _drawOperations = new List>(_drawOperations.Select(op => op.Clone())); _drawOperationsRefCounter.Dispose(); - _drawOperationsRefCounter = RefCountable.Create(Disposable.Create(DisposeDrawOperations)); + _drawOperationsRefCounter = RefCountable.Create(CreateDisposeDrawOperations(_drawOperations)); _drawOperationsCloned = false; } } - public bool Disposed { get; } - - public void Dispose() + private static IDisposable CreateDisposeDrawOperations(List> drawOperations) { - _drawOperationsRefCounter?.Dispose(); + return Disposable.Create(() => + { + foreach (var operation in drawOperations) + { + operation.Dispose(); + } + }); } - private void DisposeDrawOperations() + public bool Disposed { get; private set; } + + public void Dispose() { - foreach (var operation in DrawOperations) - { - operation.Dispose(); - } + _drawOperationsRefCounter?.Dispose(); + + Disposed = true; } } } From 823b58b3351a4984b785bf7298b7d34ffbaf71d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dariusz=20Komosi=C5=84ski?= Date: Thu, 21 Feb 2019 22:16:47 +0100 Subject: [PATCH 2/2] Add doc comment to related methods. --- .../Rendering/SceneGraph/VisualNode.cs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/Avalonia.Visuals/Rendering/SceneGraph/VisualNode.cs b/src/Avalonia.Visuals/Rendering/SceneGraph/VisualNode.cs index 71e364ffc9..19fb54e125 100644 --- a/src/Avalonia.Visuals/Rendering/SceneGraph/VisualNode.cs +++ b/src/Avalonia.Visuals/Rendering/SceneGraph/VisualNode.cs @@ -322,6 +322,9 @@ namespace Avalonia.Rendering.SceneGraph } } + /// + /// Ensures that this node draw operations have been created and are mutable (in case we are using cloned operations). + /// private void EnsureDrawOperationsCreated() { if (_drawOperations == null) @@ -339,6 +342,13 @@ namespace Avalonia.Rendering.SceneGraph } } + /// + /// Creates disposable that will dispose all items in passed draw operations after being disposed. + /// It is crucial that we don't capture current instance + /// as draw operations can be cloned and may persist across subsequent scenes. + /// + /// Draw operations that need to be disposed. + /// Disposable for given draw operations. private static IDisposable CreateDisposeDrawOperations(List> drawOperations) { return Disposable.Create(() =>