Bug 510944 - Fix memory leak in EclipseContext In multiuser environment (RAP) EclipseContext#notifyOnDisposal set keeps a reference to already disposed display object (through UISynchronize) after the context is disposed. Clear EclipseContext#notifyOnDisposal set after the listeners are notified in dispose(). 510944: Memory leak in EclipseContext https://bugs.eclipse.org/bugs/show_bug.cgi?id=510944 Change-Id: Ia4d1f6b116a9df35f57a07d07c82c0ced040dba1 Signed-off-by: Ivan Furnadjiev <ivan@eclipsesource.com> (cherry picked from commit bc866e66a5a397bb1363843e4106fd47a6009aef)
diff --git a/bundles/org.eclipse.e4.core.contexts/src/org/eclipse/e4/core/internal/contexts/EclipseContext.java b/bundles/org.eclipse.e4.core.contexts/src/org/eclipse/e4/core/internal/contexts/EclipseContext.java index 442bfa2..009fec9 100644 --- a/bundles/org.eclipse.e4.core.contexts/src/org/eclipse/e4/core/internal/contexts/EclipseContext.java +++ b/bundles/org.eclipse.e4.core.contexts/src/org/eclipse/e4/core/internal/contexts/EclipseContext.java
@@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2009, 2016 IBM Corporation and others. + * Copyright (c) 2009, 2017 IBM Corporation 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 @@ -181,6 +181,7 @@ for (IContextDisposalListener listener : notifyOnDisposal) { listener.disposed(this); } + notifyOnDisposal.clear(); } for (ValueComputation computation : localValueComputations.values()) {
diff --git a/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/contexts/EclipseContextTest.java b/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/contexts/EclipseContextTest.java index 238d1b4..d02a697 100644 --- a/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/contexts/EclipseContextTest.java +++ b/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/contexts/EclipseContextTest.java
@@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2009, 2015 IBM Corporation and others. + * Copyright (c) 2009, 2017 IBM Corporation 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 @@ -22,6 +22,7 @@ import org.eclipse.e4.core.contexts.RunAndTrack; import org.eclipse.e4.core.di.IInjector; import org.eclipse.e4.core.internal.contexts.EclipseContext; +import org.eclipse.e4.core.internal.contexts.IContextDisposalListener; import org.junit.Before; import org.junit.Test; import org.osgi.framework.FrameworkUtil; @@ -108,6 +109,20 @@ assertTrue(((EclipseContext)parentContext).getChildren().isEmpty()); } + @Test + public void testDisposeClearsNotifyOnDisposalSet() { + ((EclipseContext) context).notifyOnDisposal(new IContextDisposalListener() { + @Override + public void disposed(IEclipseContext context) { + runCounter++; + } + }); + context.dispose(); + assertEquals(1, runCounter); + context.dispose(); + assertEquals(1, runCounter); + } + /** * Tests handling of a context function defined in the parent that uses values defined in the * child