]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.db.impl/src/org/simantics/db/impl/query/AsyncReadEntry.java
Trying to wait for procedures
[simantics/platform.git] / bundles / org.simantics.db.impl / src / org / simantics / db / impl / query / AsyncReadEntry.java
index f409b40c8c330069023ede4686c6363ba76ae948..972bd381f222207b2ff91d02d33b13269321913c 100644 (file)
@@ -16,6 +16,7 @@ import org.simantics.db.exception.DatabaseException;
 import org.simantics.db.impl.BlockingAsyncProcedure;
 import org.simantics.db.impl.DebugPolicy;
 import org.simantics.db.impl.graph.AsyncBarrierImpl;
+import org.simantics.db.impl.graph.BarrierTracing;
 import org.simantics.db.impl.graph.ReadGraphImpl;
 import org.simantics.db.impl.query.QueryProcessor.SessionTask;
 import org.simantics.db.procedure.AsyncProcedure;
@@ -152,12 +153,13 @@ final public class AsyncReadEntry<T> extends CacheEntryBase<AsyncProcedure<T>> i
         AsyncProcedure<T> procedure = entry != null ? entry : procedure_;
 
         ReadGraphImpl queryGraph = graph.withParent(entry);
+        queryGraph.asyncBarrier.inc();
         
         BlockingAsyncProcedure<T> proc = new BlockingAsyncProcedure<>(queryGraph.asyncBarrier, graph, null, request);
         
         class AsyncTask extends SessionTask {
 
-               int counter = 0;
+            int counter = 0;
             T result;
             DatabaseException exception;
             
@@ -166,44 +168,58 @@ final public class AsyncReadEntry<T> extends CacheEntryBase<AsyncProcedure<T>> i
             }
 
             @Override
-            public void run(int thread) {
+            public void run0(int thread) {
                 if(needsToBlock) proc.waitBarrier();
                 if(proc.isDone()) {
+                    ReadGraphImpl executeGraph = graph.withParent(graph.parent);
+                    executeGraph.asyncBarrier.inc();
                     try {
                         result = (T)proc.get();
-                        if(procedure != null) procedure.execute(graph, result);
+                        if(procedure != null) {
+                            procedure.execute(executeGraph, result);
+                        }
                     } catch (DatabaseException e) {
-                        if(procedure != null) procedure.exception(graph, e);
+                        if(procedure != null) procedure.exception(executeGraph, e);
                         exception = e;
                     } catch (Throwable t) {
                         DatabaseException dbe = new DatabaseException(t);
-                        if(procedure != null) procedure.exception(graph, dbe);
+                        if(procedure != null) procedure.exception(executeGraph, dbe);
                         exception = dbe;
                     } finally {
-                        if (entry != null)
-                            entry.performFromCache(graph, procedure_);
+                        if (entry != null) {
+                            // This does not throw
+                            entry.performFromCache(executeGraph, procedure_);
+                        }
+                        executeGraph.asyncBarrier.dec();
+                        executeGraph.asyncBarrier.waitBarrier(procedure, executeGraph);
                     }
                 } else {
-                       if(counter++ > 10000) {
-                               AsyncBarrierImpl.printReverse(queryGraph.asyncBarrier, 2);
-                               AsyncBarrierImpl caller = queryGraph.asyncBarrier.caller;
-                               while(caller != null) {
-                                       System.err.println("called by " + AsyncBarrierImpl.report(caller));
-                                       caller = caller.caller;
-                               }
-                               for(AsyncBarrierImpl ab : AsyncBarrierImpl.debuggerMap.keySet()) {
-                               AsyncBarrierImpl.printReverse(ab, 2);
-                               }
-                               throw new IllegalStateException("Eternal loop in queries.");
-                       }
-                    graph.processor.schedule(this);            
+                    if(counter++ > 10000) {
+                        if(BarrierTracing.BOOKKEEPING) {
+                            AsyncBarrierImpl.printReverse(queryGraph.asyncBarrier, 2);
+                            AsyncBarrierImpl caller = queryGraph.asyncBarrier.caller;
+                            while(caller != null) {
+                                System.err.println("called by " + AsyncBarrierImpl.report(caller));
+                                caller = caller.caller;
+                            }
+                            for(AsyncBarrierImpl ab : BarrierTracing.debuggerMap.keySet()) {
+                                AsyncBarrierImpl.printReverse(ab, 2);
+                            }
+                        }
+                        throw new IllegalStateException("Eternal loop in queries.");
+                    }
+                    graph.processor.schedule(new AsyncTask(graph));
                 }
             }
             
         }
-        
-        request.perform(queryGraph, proc);
-        
+
+        try {
+            request.perform(queryGraph, proc);
+        } finally {
+            queryGraph.asyncBarrier.dec();
+        }
+
         AsyncTask task = new AsyncTask(graph);
 
         if(needsToBlock) task.run(0);
@@ -212,7 +228,7 @@ final public class AsyncReadEntry<T> extends CacheEntryBase<AsyncProcedure<T>> i
             graph.processor.schedule(task);
             return null;
         }
-        
+
         if(task.exception != null) throw task.exception;
         else return task.result;