]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.modeling/src/org/simantics/modeling/ComponentTypeScriptRuntimeEnvironmentRequest.java
Fixed memory leaks of SCL module listening systems
[simantics/platform.git] / bundles / org.simantics.modeling / src / org / simantics / modeling / ComponentTypeScriptRuntimeEnvironmentRequest.java
index 7f2b54559ed35f0ecb7c077fe97c6131a8ddca82..89385e5be3f111439be954cac24278c62f256f30 100644 (file)
@@ -1,7 +1,5 @@
 package org.simantics.modeling;
 
-import java.util.ArrayList;
-
 import org.simantics.db.ReadGraph;
 import org.simantics.db.common.request.ParametrizedPrimitiveRead;
 import org.simantics.db.procedure.Listener;
@@ -13,9 +11,7 @@ import org.simantics.scl.osgi.SCLOsgi;
 import org.simantics.scl.runtime.SCLContext;
 
 public class ComponentTypeScriptRuntimeEnvironmentRequest extends ParametrizedPrimitiveRead<EnvironmentSpecification, RuntimeEnvironment> {
-
-    // This array list is only needed to keep strong references to update listeners preventing their garbage collection.
-    ArrayList<UpdateListener> listeners;
+    UpdateListener listener;
     
     public ComponentTypeScriptRuntimeEnvironmentRequest(EnvironmentSpecification parameter) {
         super(parameter);
@@ -23,20 +19,22 @@ public class ComponentTypeScriptRuntimeEnvironmentRequest extends ParametrizedPr
 
     @Override
     public void register(ReadGraph graph, Listener<RuntimeEnvironment> procedure) {
-        UpdateListener listener = null;
-        if(!procedure.isDisposed()) {
+        if(!procedure.isDisposed() && listener == null) {
             listener = new UpdateListener() {
                 @Override
                 public void notifyAboutUpdate() {
                     createRuntimeEnvironment(graph, procedure, this);
                 }
             };
-            if(listeners == null)
-                listeners = new ArrayList<UpdateListener>(2);
-            listeners.add(listener);
         }
         createRuntimeEnvironment(graph, procedure, listener);
     }
+
+    @Override
+    public void unregistered() {
+        if(listener != null)
+            listener.stopListening();
+    }
     
     private void createRuntimeEnvironment(ReadGraph graph, Listener<RuntimeEnvironment> procedure, UpdateListener listener) {
         SCLContext context = SCLContext.getCurrent();