]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.osgi/src/org/simantics/scl/osgi/internal/BundleModuleSource.java
Fixed memory leaks of SCL module listening systems
[simantics/platform.git] / bundles / org.simantics.scl.osgi / src / org / simantics / scl / osgi / internal / BundleModuleSource.java
index 1f60de08688f8365c52ed78a55e378dff162d032..244c7463f0d5ade4ba574a373fd13ee9940a99b0 100644 (file)
@@ -10,7 +10,6 @@ import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
-import java.util.ArrayList;
 import java.util.Arrays;
 
 import org.eclipse.core.runtime.FileLocator;
@@ -21,7 +20,9 @@ import org.simantics.scl.compiler.module.repository.UpdateListener;
 import org.simantics.scl.compiler.source.EncodedTextualModuleSource;
 import org.simantics.scl.compiler.types.Type;
 
-public class BundleModuleSource extends EncodedTextualModuleSource {
+import gnu.trove.set.hash.THashSet;
+
+public class BundleModuleSource extends EncodedTextualModuleSource implements UpdateListener.Observable {
 
     public static final ImportDeclaration[] DEFAULT_IMPORTS = new ImportDeclaration[] {
         new ImportDeclaration("Builtin", ""),
@@ -36,13 +37,21 @@ public class BundleModuleSource extends EncodedTextualModuleSource {
     public final URL url;
     
     private byte[] digest;
-    private ArrayList<UpdateListener> listeners;
+    private THashSet<UpdateListener> listeners;
     
     public BundleModuleSource(String moduleName, Bundle bundle, URL url) {
         super(moduleName);
         this.bundle = bundle;
         this.url = url;
     }
+    
+    @Override
+    public void removeListener(UpdateListener listener) {
+        if(listeners != null)
+            synchronized(listeners) {
+                listeners.remove(listener);
+            }
+    }
 
     @Override
     protected ImportDeclaration[] getBuiltinImports(UpdateListener listener) {
@@ -84,8 +93,9 @@ public class BundleModuleSource extends EncodedTextualModuleSource {
             digest = computeDigest();
         if(listener != null) {
             if(listeners == null)
-                listeners = new ArrayList<UpdateListener>(2);
+                listeners = new THashSet<UpdateListener>(4);
             listeners.add(listener);
+            listener.addObservable(this);
         }
         return url.openStream();
     }
@@ -108,7 +118,7 @@ public class BundleModuleSource extends EncodedTextualModuleSource {
             byte[] newDigest = computeDigest();
             if(!Arrays.equals(digest, newDigest)) {
                 digest = newDigest;
-                ArrayList<UpdateListener> oldListeners = listeners;
+                THashSet<UpdateListener> oldListeners = listeners;
                 listeners = null;
                 for(UpdateListener listener : oldListeners)
                     listener.notifyAboutUpdate();