Browse Source

Fix minor memory leak in AvalonEdit.

pull/18/head
Daniel Grunwald 14 years ago
parent
commit
6030c6869c
  1. 12
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit.Tests/WeakReferenceTests.cs
  2. 2
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/CaretNavigationCommandHandler.cs
  3. 2
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/EditingCommandHandler.cs
  4. 12
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/TextAreaDefaultInputHandlers.cs

12
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit.Tests/WeakReferenceTests.cs

@ -2,6 +2,7 @@ @@ -2,6 +2,7 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Windows.Threading;
using ICSharpCode.AvalonEdit.Document;
using ICSharpCode.AvalonEdit.Editing;
using ICSharpCode.AvalonEdit.Rendering;
@ -45,7 +46,6 @@ namespace ICSharpCode.AvalonEdit @@ -45,7 +46,6 @@ namespace ICSharpCode.AvalonEdit
}
[Test]
[Ignore]
public void DocumentDoesNotHoldReferenceToTextArea()
{
TextDocument textDocument = new TextDocument();
@ -61,7 +61,6 @@ namespace ICSharpCode.AvalonEdit @@ -61,7 +61,6 @@ namespace ICSharpCode.AvalonEdit
}
[Test]
[Ignore]
public void DocumentDoesNotHoldReferenceToTextEditor()
{
TextDocument textDocument = new TextDocument();
@ -102,9 +101,12 @@ namespace ICSharpCode.AvalonEdit @@ -102,9 +101,12 @@ namespace ICSharpCode.AvalonEdit
static void GarbageCollect()
{
GC.WaitForPendingFinalizers();
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
GC.WaitForPendingFinalizers();
for (int i = 0; i < 3; i++) {
GC.WaitForPendingFinalizers();
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
// pump WPF messages so that WeakEventManager can unregister
Dispatcher.CurrentDispatcher.Invoke(DispatcherPriority.Background, new Action(delegate {}));
}
}
}
}

2
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/CaretNavigationCommandHandler.cs

@ -73,6 +73,8 @@ namespace ICSharpCode.AvalonEdit.Editing @@ -73,6 +73,8 @@ namespace ICSharpCode.AvalonEdit.Editing
AddBinding(EditingCommands.SelectToDocumentEnd, Ctrl | Shift, Key.End, OnMoveCaretExtendSelection(CaretMovementType.DocumentEnd));
CommandBindings.Add(new CommandBinding(ApplicationCommands.SelectAll, OnSelectAll));
TextAreaDefaultInputHandler.WorkaroundWPFMemoryLeak(InputBindings);
}
static void OnSelectAll(object target, ExecutedRoutedEventArgs args)

2
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/EditingCommandHandler.cs

@ -75,6 +75,8 @@ namespace ICSharpCode.AvalonEdit.Editing @@ -75,6 +75,8 @@ namespace ICSharpCode.AvalonEdit.Editing
CommandBindings.Add(new CommandBinding(AvalonEditCommands.ConvertLeadingTabsToSpaces, OnConvertLeadingTabsToSpaces));
CommandBindings.Add(new CommandBinding(AvalonEditCommands.ConvertLeadingSpacesToTabs, OnConvertLeadingSpacesToTabs));
CommandBindings.Add(new CommandBinding(AvalonEditCommands.IndentSelection, OnIndentSelection));
TextAreaDefaultInputHandler.WorkaroundWPFMemoryLeak(InputBindings);
}
static TextArea GetTextArea(object target)

12
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/TextAreaDefaultInputHandlers.cs

@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Linq;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Input;
@ -54,6 +54,16 @@ namespace ICSharpCode.AvalonEdit.Editing @@ -54,6 +54,16 @@ namespace ICSharpCode.AvalonEdit.Editing
return kb;
}
internal static void WorkaroundWPFMemoryLeak(List<InputBinding> inputBindings)
{
// Work around WPF memory leak:
// KeyBinding retains a reference to whichever UIElement it is used in first.
// Using a dummy element for this purpose ensures that we don't leak
// a real text editor (which a potentially large document).
UIElement dummyElement = new UIElement();
dummyElement.InputBindings.AddRange(inputBindings);
}
#region Undo / Redo
UndoStack GetUndoStack()
{

Loading…
Cancel
Save