]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/genericrelation/ExternalRequest.java
Multiple reader thread support for db client
[simantics/platform.git] / bundles / org.simantics.db.layer0 / src / org / simantics / db / layer0 / genericrelation / ExternalRequest.java
index 77520aa6e66ce2ed324ec91b8868955698a4759a..8cf5652ce0367f31baeca31e72c0f70425657c0c 100644 (file)
@@ -1,45 +1,48 @@
-package org.simantics.db.layer0.genericrelation;\r
-\r
-import org.simantics.db.ReadGraph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.Session;\r
-import org.simantics.db.common.request.ParametrizedPrimitiveRead;\r
-import org.simantics.db.layer0.adapter.GenericRelationIndex;\r
-import org.simantics.db.procedure.Listener;\r
-import org.simantics.utils.datastructures.Pair;\r
-\r
-class ExternalRequest extends ParametrizedPrimitiveRead<Pair<GenericRelationIndex,Resource>,Long> implements Runnable {\r
-\r
-    private static long value = 0;\r
-    private Session session;\r
-    private Listener<Long> procedure;\r
-\r
-    public ExternalRequest(GenericRelationIndex index, Resource model) {\r
-        super(Pair.make(index, model));\r
-    }\r
-\r
-    @Override\r
-    public void register(ReadGraph graph, Listener<Long> procedure) {\r
-        synchronized(getClass()) {\r
-            procedure.execute(value++);\r
-        }\r
-        if(procedure.isDisposed()) return;\r
-        assert(this.procedure == null);\r
-        this.session = graph.getSession();\r
-        this.procedure = procedure;\r
-        parameter.first.addListener(graph, parameter.second, this);\r
-    }\r
-    \r
-    @Override\r
-    public void unregistered() {\r
-        parameter.first.removeListener(session, parameter.second, this);\r
-    }\r
-    \r
-    @Override\r
-    public void run() {\r
-        synchronized(getClass()) {\r
-            procedure.execute(value++);\r
-        }\r
-    }\r
-    \r
+package org.simantics.db.layer0.genericrelation;
+
+import org.simantics.db.ReadGraph;
+import org.simantics.db.Resource;
+import org.simantics.db.Session;
+import org.simantics.db.common.request.ParametrizedPrimitiveRead;
+import org.simantics.db.layer0.adapter.GenericRelationIndex;
+import org.simantics.db.procedure.Listener;
+import org.simantics.utils.datastructures.Pair;
+
+class ExternalRequest extends ParametrizedPrimitiveRead<Pair<GenericRelationIndex,Resource>,Long> implements Runnable {
+
+    private static long value = 0;
+    private Session session;
+    private Listener<Long> procedure;
+
+    public ExternalRequest(GenericRelationIndex index, Resource model) {
+        super(Pair.make(index, model));
+    }
+
+    @Override
+    public void register(ReadGraph graph, Listener<Long> procedure) {
+        synchronized(getClass()) {
+            procedure.execute(value++);
+        }
+        if(procedure.isDisposed()) return;
+        assert(this.procedure == null);
+        this.session = graph.getSession();
+        this.procedure = procedure;
+        parameter.first.addListener(graph, parameter.second, this);
+    }
+
+    @Override
+    public void unregistered() {
+        // Session will be null if the listener was not added at all.
+        if (session != null) {
+            parameter.first.removeListener(session, parameter.second, this);
+        }
+    }
+
+    @Override
+    public void run() {
+        synchronized(getClass()) {
+            procedure.execute(value++);
+        }
+    }
+
 }
\ No newline at end of file