]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/issues/SCLIssuesContentProvider.java
Fixed memory leaks of SCL module listening systems
[simantics/platform.git] / bundles / org.simantics.scl.ui / src / org / simantics / scl / ui / issues / SCLIssuesContentProvider.java
index eb5c25e4ac0ac3f402b7c78c466db586065a05fc..7a5daffdbee0716670932e1358a3f227cf2f8dc4 100644 (file)
@@ -16,6 +16,7 @@ import org.simantics.scl.compiler.module.repository.ModuleRepository;
 import org.simantics.scl.compiler.module.repository.UpdateListener;
 
 import gnu.trove.map.hash.THashMap;
+import gnu.trove.procedure.TObjectObjectProcedure;
 import gnu.trove.procedure.TObjectProcedure;
 
 public class SCLIssuesContentProvider implements IStructuredContentProvider {
@@ -39,16 +40,19 @@ public class SCLIssuesContentProvider implements IStructuredContentProvider {
     }
     
     private UpdateListener getUpdateListener(String moduleName) {
-        UpdateListener listener = updateListeners.get(moduleName);
-        if(listener == null) {
-            listener = new UpdateListener() {
-                @Override
-                public void notifyAboutUpdate() {
-                    if(!disposed)
-                        listenModule(moduleName);
-                }
-            };
-            updateListeners.put(moduleName, listener);
+        UpdateListener listener;
+        synchronized(updateListeners) {
+            listener = updateListeners.get(moduleName);
+            if(listener == null) {
+                listener = new UpdateListener() {
+                    @Override
+                    public void notifyAboutUpdate() {
+                        if(!disposed)
+                            listenModule(moduleName);
+                    }
+                };
+                updateListeners.put(moduleName, listener);
+            }
         }
         return listener;
     }
@@ -106,7 +110,20 @@ public class SCLIssuesContentProvider implements IStructuredContentProvider {
 
     @Override
     public void dispose() {
+        if(this.disposed)
+            return;
         this.disposed = true;
+        if(repository != null)
+            synchronized(updateListeners) {
+                updateListeners.forEachEntry(new TObjectObjectProcedure<String, UpdateListener>() {
+                    @Override
+                    public boolean execute(String moduleName, UpdateListener listener) {
+                        listener.stopListening();
+                        return true;
+                    }
+                });
+                updateListeners.clear();
+            }
     }
 
     @Override