import org.simantics.db.impl.query.AsyncReadEntry;
import org.simantics.db.impl.query.PendingTaskSupport;
import org.simantics.db.procedure.AsyncProcedure;
-
+import org.simantics.db.request.AsyncRead;
public class BlockingAsyncProcedure<Result> implements AsyncProcedure<Result> {
private static final Object NO_RESULT = new Object();
- public final Object key;
- public final ReadGraphImpl queryGraph;
- public final ReadGraphImpl callerGraph;
- public final AsyncProcedure<Result> procedure;
- public PendingTaskSupport pendingTaskSupport;
- public Object result = NO_RESULT;
- public Throwable exception = null;
+ private final Object key;
+ private final ReadGraphImpl queryGraph;
+ private final ReadGraphImpl callerGraph;
+ private final AsyncProcedure<Result> procedure;
+ private PendingTaskSupport pendingTaskSupport;
+ private final boolean needsToBlock;
+ private Object result = NO_RESULT;
+ private Throwable exception = null;
private ReadGraphImpl queryGraph() {
return queryGraph;
}
public BlockingAsyncProcedure(ReadGraphImpl callerGraph, AsyncReadEntry<Result> entry, AsyncProcedure<Result> procedure, Object key, boolean needsToBlock) {
-
+
// A new graph for evaluating the query with correct parent and asyncBarrier
queryGraph = callerGraph.withParent(entry, () -> {
dispatchProcedure(queryGraph(), callerGraph, entry, procedure, needsToBlock);
- });
+ }, needsToBlock);
queryGraph.asyncBarrier.inc();
this.key = key;
this.queryGraph.asyncBarrier.inc();
this.callerGraph = callerGraph;
+ this.needsToBlock = needsToBlock;
if (BarrierTracing.BOOKKEEPING) {
BarrierTracing.registerBAP(this);
}
@SuppressWarnings("unchecked")
public Result get() throws DatabaseException {
- queryGraph.asyncBarrier.waitBarrier(key, queryGraph);
+ if(needsToBlock)
+ queryGraph.asyncBarrier.waitBarrier(key, queryGraph);
if(exception != null) {
if(exception instanceof DatabaseException) throw (DatabaseException)exception;
AsyncProcedure<Result> procedure = entry != null ? entry : procedure_;
- ReadGraphImpl executeGraph = parentGraph.withParent(parentGraph.parent);
+ ReadGraphImpl executeGraph = parentGraph.withParent(parentGraph.parent, null, needsToBlock);
executeGraph.asyncBarrier.inc();
try {
if(procedure != null) {
}
}
+
+ public void print() {
+ System.err.println("BlockingAsyncProcedure");
+ System.err.println("-key: " + key);
+ System.err.println("-queryGraph: " + queryGraph);
+ System.err.println("-callerGraph: " + callerGraph);
+ System.err.println("-procedure: " + procedure);
+ System.err.println("-pendingTaskSupport: " + pendingTaskSupport);
+ System.err.println("-result: " + result);
+ System.err.println("-exception: " + exception);
+ }
+
+ public Result performSync(AsyncRead<Result> request) throws DatabaseException {
+ try {
+ request.perform(queryGraph, this);
+ } finally {
+ dec();
+ }
+ return get();
+ }
+
+ public void performAsync(AsyncRead<Result> request) throws DatabaseException {
+ try {
+ request.perform(queryGraph, this);
+ } finally {
+ dec();
+ }
+ }
}