From 7a4a0a06bd51d2fcdc34499278ebd9f56c6422c8 Mon Sep 17 00:00:00 2001 From: Anton Leherbauer Date: Thu, 19 Feb 2015 08:55:37 +0100 Subject: [PATCH] Bug 420928 - Terminal widget leaks memory Change-Id: I38f62a629f0a11e9b5dc6e33147f0ea06777bd6c Signed-off-by: Anton Leherbauer --- .../emulator/VT100TerminalControl.java | 11 +++++-- .../textcanvas/PollingTextCanvasModel.java | 30 ++++++++++++++----- 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/terminal/plugins/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/emulator/VT100TerminalControl.java b/terminal/plugins/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/emulator/VT100TerminalControl.java index 028ce2d9a17..af0b87c63a4 100644 --- a/terminal/plugins/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/emulator/VT100TerminalControl.java +++ b/terminal/plugins/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/emulator/VT100TerminalControl.java @@ -38,6 +38,7 @@ * Anton Leherbauer (Wind River) - [434749] UnhandledEventLoopException when copying to clipboard while the selection is empty * Martin Oberhuber (Wind River) - [436612] Restore Eclipse 3.4 compatibility by using Reflection * Anton Leherbauer (Wind River) - [458398] Add support for normal/application cursor keys mode + * Anton Leherbauer (Wind River) - [420928] Terminal widget leaks memory *******************************************************************************/ package org.eclipse.tm.internal.terminal.emulator; @@ -96,7 +97,6 @@ import org.eclipse.tm.internal.terminal.provisional.api.ITerminalConnector; import org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl; import org.eclipse.tm.internal.terminal.provisional.api.Logger; import org.eclipse.tm.internal.terminal.provisional.api.TerminalState; -import org.eclipse.tm.internal.terminal.textcanvas.ITextCanvasModel; import org.eclipse.tm.internal.terminal.textcanvas.PipedInputStream; import org.eclipse.tm.internal.terminal.textcanvas.PollingTextCanvasModel; import org.eclipse.tm.internal.terminal.textcanvas.TextCanvas; @@ -182,6 +182,8 @@ public class VT100TerminalControl implements ITerminalControlForText, ITerminalC */ volatile private Job fJob; + private PollingTextCanvasModel fPollingTextCanvasModel; + public VT100TerminalControl(ITerminalListener target, Composite wndParent, ITerminalConnector[] connectors) { this(target, wndParent, connectors, false); } @@ -387,6 +389,7 @@ public class VT100TerminalControl implements ITerminalControlForText, ITerminalC } disconnectTerminal(); fClipboard.dispose(); + fPollingTextCanvasModel.stopPolling(); getTerminalText().dispose(); } @@ -711,8 +714,8 @@ public class VT100TerminalControl implements ITerminalControlForText, ITerminalC ITerminalTextDataSnapshot snapshot=fTerminalModel.makeSnapshot(); // TODO how to get the initial size correctly! snapshot.updateSnapshot(false); - ITextCanvasModel canvasModel=new PollingTextCanvasModel(snapshot); - fCtlText=new TextCanvas(fWndParent,canvasModel,SWT.NONE,new TextLineRenderer(fCtlText,canvasModel)); + fPollingTextCanvasModel=new PollingTextCanvasModel(snapshot); + fCtlText=new TextCanvas(fWndParent,fPollingTextCanvasModel,SWT.NONE,new TextLineRenderer(fCtlText,fPollingTextCanvasModel)); fCtlText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); fCtlText.addResizeHandler(new TextCanvas.ResizeListener() { @@ -1232,10 +1235,12 @@ public class VT100TerminalControl implements ITerminalControlForText, ITerminalC if(fCtlText!=null && !fCtlText.isDisposed()) { if (isConnected()) { fCtlText.setCursorEnabled(true); + fPollingTextCanvasModel.startPolling(); } else { fCtlText.setCursorEnabled(false); // Stop capturing all key events fFocusListener.captureKeyEvents(false); + fPollingTextCanvasModel.stopPolling(); } } } diff --git a/terminal/plugins/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/textcanvas/PollingTextCanvasModel.java b/terminal/plugins/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/textcanvas/PollingTextCanvasModel.java index 9ca030403be..b54fdf643f8 100644 --- a/terminal/plugins/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/textcanvas/PollingTextCanvasModel.java +++ b/terminal/plugins/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/textcanvas/PollingTextCanvasModel.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2007 Wind River Systems, Inc. and others. + * Copyright (c) 2007, 2015 Wind River Systems, Inc. and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -7,6 +7,7 @@ * * Contributors: * Michael Scharf (Wind River) - initial API and implementation + * Anton Leherbauer (Wind River) - [420928] Terminal widget leaks memory *******************************************************************************/ package org.eclipse.tm.internal.terminal.textcanvas; import org.eclipse.swt.widgets.Display; @@ -17,19 +18,32 @@ import org.eclipse.tm.terminal.model.ITerminalTextDataSnapshot; * */ public class PollingTextCanvasModel extends AbstractTextCanvasModel { - int fPollInterval=50; + private static final int DEFAULT_POLL_INTERVAL = 50; + int fPollInterval = -1; + /** * */ public PollingTextCanvasModel(ITerminalTextDataSnapshot snapshot) { super(snapshot); - Display.getDefault().timerExec(fPollInterval,new Runnable(){ - public void run() { - update(); - Display.getDefault().timerExec(fPollInterval,this); - }}); + startPolling(); } public void setUpdateInterval(int t) { - fPollInterval=t; + fPollInterval = t; + } + public void stopPolling() { + // timerExec only dispatches if the delay is >=0 + fPollInterval = -1; + } + public void startPolling() { + if (fPollInterval < 0) { + fPollInterval = DEFAULT_POLL_INTERVAL; + Display.getDefault().timerExec(fPollInterval, new Runnable(){ + public void run() { + update(); + Display.getDefault().timerExec(fPollInterval, this); + } + }); + } } }