tmf: Bug 490400: Leaking widgets due to incorrect cleanup in dispose()
authorPatrick Tasse <patrick.tasse@gmail.com>
Mon, 4 Apr 2016 22:38:02 +0000 (18:38 -0400)
committerPatrick Tasse <patrick.tasse@gmail.com>
Mon, 11 Apr 2016 20:24:03 +0000 (16:24 -0400)
Subclasses of Widget now perform their cleanup in a DisposeListener.

Disposing any child Control of a Composite is handled by the platform
and is therefore removed from the cleanup handling.

Subclasses of TmfComponent that are associated with a Control now
dispose their Control when TmfComponent.dispose() is called, and perform
their cleanup in a DisposeListener, including calling super.dispose().
The DisposeListener is attached to the Control.

Change-Id: Ie6bf7b18b8fad6a0fc0a683209a92fa39bbc8907
Signed-off-by: Patrick Tasse <patrick.tasse@gmail.com>
Reviewed-on: https://git.eclipse.org/r/70057
Reviewed-by: Matthew Khouzam <matthew.khouzam@ericsson.com>
Reviewed-by: Hudson CI
16 files changed:
analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/analysis/timing/ui/views/segmentstore/density/AbstractSegmentStoreDensityViewer.java
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/viewers/piecharts/TmfPieChartViewer.java
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/viewers/statistics/TmfStatisticsViewer.java
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/editors/TmfEventsEditor.java
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/events/TmfEventsTable.java
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/events/TmfEventsTableHeader.java
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/table/TmfSimpleTableViewer.java
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xycharts/TmfXYChartViewer.java
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/views/uml2sd/DrawableToolTip.java
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/views/uml2sd/ScrollView.java
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/widgets/rawviewer/TmfRawEventViewer.java
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/widgets/tabsview/TmfViewerFolder.java
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/widgets/timegraph/TimeGraphViewer.java
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/widgets/timegraph/dialogs/TimeGraphLegend.java
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/widgets/timegraph/widgets/TimeGraphControl.java
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/widgets/timegraph/widgets/TimeGraphScale.java

index 6f4fd1f01cd94261acafefc7de55313a80981666..4e003ec0a28d09361562b47eba202135a98fc1ab 100644 (file)
@@ -105,6 +105,10 @@ public abstract class AbstractSegmentStoreDensityViewer extends TmfViewer {
         fDragProvider.register();
         fTooltipProvider = new SimpleTooltipProvider(this);
         fTooltipProvider.register();
+
+        fChart.addDisposeListener((e) -> {
+            internalDispose();
+        });
     }
 
     /**
@@ -272,6 +276,10 @@ public abstract class AbstractSegmentStoreDensityViewer extends TmfViewer {
 
     @Override
     public void dispose() {
+        fChart.dispose();
+    }
+
+    private void internalDispose() {
         if (fSegmentStoreProvider != null && fListener != null) {
             fSegmentStoreProvider.removeListener(fListener);
         }
index e387bb9a198f44de4c166e411ca1531cc8b22905..c734fdb305d32f1d32b944b4bc1ce1254a8a3fa0 100644 (file)
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2015 Ericsson
+ * Copyright (c) 2015, 2016 Ericsson
  *
  * All rights reserved. This program and the accompanying materials are
  * made available under the terms of the Eclipse Public License v1.0 which
@@ -196,17 +196,6 @@ public class TmfPieChartViewer extends Composite {
         setCurrentState(new PieChartViewerStateNoContentSelected(this));
     }
 
-    @Override
-    public void dispose() {
-        if (fGlobalPC != null) {
-            fGlobalPC.dispose();
-        }
-        if (fTimeRangePC != null) {
-            fTimeRangePC.dispose();
-        }
-        super.dispose();
-    }
-
     /**
      * Updates the data contained in the Global PieChart by using a Map.
      * Normally, this method is only called by the state machine.
index 34c9718ab23d7b84d41c59c57aeb12849e317f14..ac89d9bb9b96dc58de22b4721134cf009a07bba0 100644 (file)
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2012, 2015 Ericsson
+ * Copyright (c) 2012, 2016 Ericsson
  *
  * All rights reserved. This program and the accompanying materials are
  * made available under the terms of the Eclipse Public License v1.0 which
@@ -153,10 +153,18 @@ public class TmfStatisticsViewer extends TmfViewer {
 
         initContent(parent);
         initInput();
+
+        fSash.addDisposeListener((e) -> {
+            internalDispose();
+        });
     }
 
     @Override
     public void dispose() {
+        fSash.dispose();
+    }
+
+    private void internalDispose() {
         super.dispose();
         if (fWaitCursor != null) {
             fWaitCursor.dispose();
index 0ce8e12d15f425ae683f1e44b21603fa24071a7d..c45fa3434914443ea7c37fb4cdf3ecc6b193f3d3 100644 (file)
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2010, 2015 Ericsson, École Polytechnique de Montréal
+ * Copyright (c) 2010, 2016 Ericsson, École Polytechnique de Montréal
  *
  * All rights reserved. This program and the accompanying materials are
  * made available under the terms of the Eclipse Public License v1.0 which
@@ -276,9 +276,6 @@ public class TmfEventsEditor extends TmfEditor implements ITmfTraceEditor, IReus
                 TmfTraceColumnManager.saveColumnOrder(fTrace.getTraceTypeId(), fEventsTable.getColumnOrder());
             }
         }
-        if (fEventsTable != null) {
-            fEventsTable.dispose();
-        }
         super.dispose();
     }
 
index 7ad2b6d01c402fcf67bd5ed66e8d3398fa1a806a..54d991e3894de0d37446261c5ac28cd71a714f74 100644 (file)
@@ -951,6 +951,10 @@ public class TmfEventsTable extends TmfComponent implements IGotoMarker, IColorS
         fRawViewer.setVisible(false);
 
         createPopupMenu();
+
+        fComposite.addDisposeListener((e) -> {
+            internalDispose();
+        });
     }
 
     /**
@@ -1479,16 +1483,19 @@ public class TmfEventsTable extends TmfComponent implements IGotoMarker, IColorS
 
     @Override
     public void dispose() {
+        fComposite.dispose();
+    }
+
+    private void internalDispose() {
         stopSearchThread();
         stopFilterThread();
         PlatformUI.getWorkbench().getThemeManager().removePropertyChangeListener(this);
         ColorSettingsManager.removeColorSettingsListener(this);
-        fComposite.dispose();
+        fCache.clear();
         if ((fTrace != null) && fDisposeOnClose) {
             fTrace.dispose();
         }
         fResourceManager.dispose();
-        fRawViewer.dispose();
         if (fRawViewerPopupMenuManager != null) {
             fRawViewerPopupMenuManager.dispose();
         }
index 9703061fe56058fb8f4d652663a1f10c5218dd7d..0b311a8c85aa2236c5f584a5a0258d34c13cd974 100644 (file)
@@ -113,12 +113,9 @@ public class TmfEventsTableHeader extends Composite {
                 toggle();
             }
         });
-    }
-
-    @Override
-    public void dispose() {
-        super.dispose();
-        fLabelBackground.dispose();
+        addDisposeListener((e) -> {
+            fLabelBackground.dispose();
+        });
     }
 
     @Override
index d86404e8df563fdd304758fa051270244dd02ba5..f204774deb006837ccc29fe108779bbd98f4333e 100644 (file)
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2015 Ericsson
+ * Copyright (c) 2015, 2016 Ericsson
  *
  * All rights reserved. This program and the accompanying materials are
  * made available under the terms of the Eclipse Public License v1.0 which
@@ -192,6 +192,10 @@ public class TmfSimpleTableViewer extends TmfViewer {
 
         Menu tablePopup = fTablePopupMenuManager.createContextMenu(getTableViewer().getTable());
         getTableViewer().getTable().setMenu(tablePopup);
+
+        tableControl.addDisposeListener((e) -> {
+            internalDispose();
+        });
     }
 
     @Override
@@ -199,6 +203,9 @@ public class TmfSimpleTableViewer extends TmfViewer {
         if (fTableViewer != null) {
             fTableViewer.getControl().dispose();
         }
+    }
+
+    private void internalDispose() {
         if (fTablePopupMenuManager != null) {
             fTablePopupMenuManager.dispose();
         }
index ee224645e53a666dc18e2da82ca0b3972caf53d4..b9baefac3e27c1767d32eda7059e80722fba18cf 100644 (file)
@@ -1,5 +1,5 @@
 /**********************************************************************
- * Copyright (c) 2013, 2015 Ericsson, École Polytechnique de Montréal
+ * Copyright (c) 2013, 2016 Ericsson, École Polytechnique de Montréal
  *
  * All rights reserved. This program and the accompanying materials are
  * made available under the terms of the Eclipse Public License v1.0 which
@@ -118,6 +118,10 @@ public abstract class TmfXYChartViewer extends TmfTimeViewer implements ITmfChar
         fMouseWheelZoomProvider = new TmfMouseWheelZoomProvider(this);
         fToolTipProvider = new TmfSimpleTooltipProvider(this);
         fMouseDragProvider = new TmfMouseDragProvider(this);
+
+        fSwtChart.addDisposeListener((e) -> {
+            internalDispose();
+        });
     }
 
     // ------------------------------------------------------------------------
@@ -239,10 +243,14 @@ public abstract class TmfXYChartViewer extends TmfTimeViewer implements ITmfChar
     // ------------------------------------------------------------------------
     // TmfComponent
     // ------------------------------------------------------------------------
+
     @Override
     public void dispose() {
-        super.dispose();
         fSwtChart.dispose();
+    }
+
+    private void internalDispose() {
+        super.dispose();
 
         if (fMouseSelectionProvider != null) {
             fMouseSelectionProvider.dispose();
index da7673250a03b6619e849e04cfd0240898fee49b..325d27333ebea3997ff6c0a895a4c074fdc06f2f 100755 (executable)
@@ -1,5 +1,5 @@
 /**********************************************************************
- * Copyright (c) 2005, 2014 IBM Corporation, Ericsson
+ * Copyright (c) 2005, 2016 IBM Corporation, Ericsson
  * 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
@@ -113,6 +113,11 @@ public class DrawableToolTip implements PaintListener {
         fToolTipShell.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
         fToolTipShell.addPaintListener(this);
         fToolTipShell.setSize(SHELL_WIDTH, SHELL_HEIGHT);
+        fToolTipShell.addDisposeListener((e) -> {
+            for (int i = 0; i < fColors.length; i++) {
+                fColors[i].dispose();
+            }
+        });
 
         fColors = new Color[NUMBER_STEPS];
         int greenBlue = BASE_GREEN_BLUE_VALUE;
@@ -250,12 +255,10 @@ public class DrawableToolTip implements PaintListener {
     }
 
     /**
-     * Disposes the system resource used by this kind of toolTips (a colors array essentially)
+     * Dispose this tool tip
      */
     public void dispose() {
-        for (int i = 0; i < fColors.length; i++) {
-            fColors[i].dispose();
-        }
+        fToolTipShell.dispose();
     }
 
     @Override
index 629fbd35614af727645222ba1697d0ce63372e9d..7074aad49e5313d87d41eb25e1d1193a943fc595 100755 (executable)
@@ -1,5 +1,5 @@
 /**********************************************************************
- * Copyright (c) 2005, 2014 IBM Corporation, Ericsson
+ * Copyright (c) 2005, 2016 IBM Corporation, Ericsson
  * 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
@@ -407,6 +407,23 @@ public class ScrollView extends Composite {
                 }
             });
         }
+
+        addDisposeListener((e) -> {
+            if (fAutoScroll != null) {
+                fAutoScroll.cancel();
+                fAutoScroll = null;
+            }
+            fViewControl = null;
+            fVertScrollBar = null;
+            fHorScrollBar = null;
+            if (fCornerControl != null) {
+                Object data = fCornerControl.getData();
+                if (data instanceof Overview) {
+                    ((Overview) data).dispose();
+                }
+            }
+            fCornerControl = null;
+        });
     }
 
     // ------------------------------------------------------------------------
@@ -423,35 +440,6 @@ public class ScrollView extends Composite {
         fViewControl.setCursor(cursor);
     }
 
-    @Override
-    public void dispose() {
-        if (fAutoScroll != null) {
-            fAutoScroll.cancel();
-            fAutoScroll = null;
-        }
-        if (fViewControl != null) {
-            fViewControl.dispose();
-        }
-        fViewControl = null;
-        if (fVertScrollBar != null) {
-            fVertScrollBar.dispose();
-        }
-        fVertScrollBar = null;
-        if (fHorScrollBar != null) {
-            fHorScrollBar.dispose();
-        }
-        fHorScrollBar = null;
-        if (fCornerControl != null) {
-            Object data = fCornerControl.getData();
-            if (data instanceof Overview) {
-                ((Overview) data).dispose();
-            }
-            fCornerControl.dispose();
-            fCornerControl = null;
-        }
-        super.dispose();
-    }
-
     @Override
     public Rectangle getClientArea() {
         Rectangle area = fViewControl.getClientArea();
index 397fc78e5344e62557d8a139147226390ac345eb..5731c373820d9e00cd632c309b5adc9133a2a87c 100644 (file)
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2010, 2015 Ericsson
+ * Copyright (c) 2010, 2016 Ericsson
  *
  * All rights reserved. This program and the accompanying materials are
  * made available under the terms of the Eclipse Public License v1.0 which
@@ -198,15 +198,13 @@ public class TmfRawEventViewer extends Composite implements ControlListener, Sel
 
         // Prevent the slider from being traversed
         setTabList(new Control[] { fScrolledComposite });
-    }
 
-    @Override
-    public void dispose() {
-        if (fBottomContext != null) {
-            fBottomContext.dispose();
-        }
-        PlatformUI.getWorkbench().getThemeManager().removePropertyChangeListener(this);
-        super.dispose();
+        addDisposeListener((e) -> {
+            if (fBottomContext != null) {
+                fBottomContext.dispose();
+            }
+            PlatformUI.getWorkbench().getThemeManager().removePropertyChangeListener(TmfRawEventViewer.this);
+        });
     }
 
     // ------------------------------------------------------------------------
index 2b04ace3446162f5cb5624a886dceb534453a031..4d08e8b1004024f45bb185005e1e7d65632c97d9 100644 (file)
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2012, 2014 Ericsson
+ * Copyright (c) 2012, 2016 Ericsson
  *
  * All rights reserved. This program and the accompanying materials are
  * made available under the terms of the Eclipse Public License v1.0 which
@@ -69,17 +69,6 @@ public class TmfViewerFolder extends Composite {
         initFolder();
     }
 
-    @Override
-    public void dispose() {
-        super.dispose();
-        for (ITmfViewer viewer : fViewers.values()) {
-            viewer.dispose();
-        }
-        if (fFolder != null) {
-            fFolder.dispose();
-        }
-    }
-
     /**
      * Disposes of all the viewers contained in the folder and restart to a
      * clean state.
index ee8f7b7db24646db278c892192d3a31e9f34e0ef..b783337ce2e4c07267344e8c7b7e43f22ee53aed 100644 (file)
@@ -42,8 +42,6 @@ import org.eclipse.jface.window.Window;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.ControlAdapter;
 import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
 import org.eclipse.swt.events.KeyAdapter;
 import org.eclipse.swt.events.KeyEvent;
 import org.eclipse.swt.events.MenuDetectListener;
@@ -466,12 +464,9 @@ public class TimeGraphViewer implements ITimeDataProvider, IMarkerAxisListener,
                 super.redraw();
             }
         };
-        fDataViewer.addDisposeListener(new DisposeListener() {
-            @Override
-            public void widgetDisposed(DisposeEvent e) {
-                if (fMarkersMenu != null) {
-                    fMarkersMenu.dispose();
-                }
+        fDataViewer.addDisposeListener((e) -> {
+            if (fMarkersMenu != null) {
+                fMarkersMenu.dispose();
             }
         });
         GridLayout gl = new GridLayout(2, false);
@@ -653,17 +648,20 @@ public class TimeGraphViewer implements ITimeDataProvider, IMarkerAxisListener,
         fDataViewer.update();
         adjustHorizontalScrollBar();
         adjustVerticalScrollBar();
+
+        fDataViewer.addDisposeListener((e) -> {
+            saveOptions();
+            fColorScheme.dispose();
+        });
+
         return fDataViewer;
     }
 
     /**
-     * Dispose the view.
+     * Dispose the time graph viewer.
      */
     public void dispose() {
-        saveOptions();
-        fTimeGraphCtrl.dispose();
         fDataViewer.dispose();
-        fColorScheme.dispose();
     }
 
     /**
index 07c76446dcdd0ae116313506137e36103b55f76b..d87399af4cb6c5cb9ae95560dc4e3d72a27d6137 100644 (file)
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2014 Ericsson.
+ * Copyright (c) 2009, 2016 Ericsson.
  *
  * All rights reserved. This program and the accompanying materials are
  * made available under the terms of the Eclipse Public License v1.0 which
@@ -92,6 +92,9 @@ public class TimeGraphLegend extends TitleAreaDialog {
         setDialogHelpAvailable(false);
         setHelpAvailable(false);
 
+        composite.addDisposeListener((e) -> {
+            fResourceManager.dispose();
+        });
         return composite;
     }
 
@@ -179,13 +182,6 @@ public class TimeGraphLegend extends TitleAreaDialog {
             gc.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_BLACK));
             gc.drawRectangle(0, 0, r.width - 1, r.height - 1);
         }
-
-        @Override
-        public void dispose() {
-            super.dispose();
-            color.dispose();
-        }
-
     }
 
 }
index 9237c72a2cf373be54d1eaf3debfbc6373e9d259..2b949633942e5a457f02c29ccedcf5dd474c95aa 100644 (file)
@@ -205,15 +205,12 @@ public class TimeGraphControl extends TimeGraphBaseControl
         addKeyListener(this);
         addMenuDetectListener(this);
         addListener(SWT.MouseWheel, this);
-    }
-
-    @Override
-    public void dispose() {
-        super.dispose();
-        fResourceManager.dispose();
-        for (Font font : fFonts.values()) {
-            font.dispose();
-        }
+        addDisposeListener((e) -> {
+            fResourceManager.dispose();
+            for (Font font : fFonts.values()) {
+                font.dispose();
+            }
+        });
     }
 
     /**
index 93cc1fd2cb4cbee1c037e0da34f520ddea79713d..bcb6c1d9572b465af8b795d8657e2ac2dfeb5a9b 100644 (file)
@@ -137,12 +137,9 @@ public class TimeGraphScale extends TimeGraphBaseControl implements
         addMouseListener(this);
         addMouseMoveListener(this);
         TimeDraw.updateTimeZone();
-    }
-
-    @Override
-    public void dispose() {
-        TmfSignalManager.deregister(this);
-        super.dispose();
+        addDisposeListener((e) -> {
+            TmfSignalManager.deregister(TimeGraphScale.this);
+        });
     }
 
     /**
This page took 0.036322 seconds and 5 git commands to generate.