import org.simantics.db.AsyncReadGraph;
import org.simantics.db.common.utils.Logger;
import org.simantics.db.exception.DatabaseException;
+import org.simantics.db.impl.graph.AsyncBarrierImpl;
import org.simantics.db.impl.graph.ReadGraphImpl;
import org.simantics.db.procedure.AsyncMultiProcedure;
private static final Object NO_RESULT = new Object();
private final Object key;
- private final ReadGraphImpl graph;
+ private final AsyncBarrierImpl barrier;
+ private final ReadGraphImpl procedureGraph;
private final AsyncMultiProcedure<Result> procedure;
private Object result = NO_RESULT;
private Throwable exception = null;
- public BlockingAsyncMultiProcedure(ReadGraphImpl graph, AsyncMultiProcedure<Result> procedure, Object key) {
+ public BlockingAsyncMultiProcedure(AsyncBarrierImpl barrier, ReadGraphImpl procedureGraph, AsyncMultiProcedure<Result> procedure, Object key) {
this.procedure = procedure;
this.key = key;
- this.graph = ReadGraphImpl.newAsync(graph);
- this.graph.asyncBarrier.inc();
+ this.barrier = barrier;
+ this.barrier.inc();
+ this.procedureGraph = procedureGraph;
}
@Override
public void execute(AsyncReadGraph graph, Result result) {
this.result = result;
try {
- if(procedure != null) procedure.execute(graph, result);
+ if(procedure != null) procedure.execute(procedureGraph, result);
} catch (Throwable throwable) {
Logger.defaultLogError("AsyncProcedure.execute threw for " + procedure, throwable);
}
@Override
public void finished(AsyncReadGraph graph) {
- this.graph.asyncBarrier.dec();
try {
- if(procedure != null) procedure.finished(graph);
+ if(procedure != null) procedure.finished(procedureGraph);
} catch (Throwable throwable) {
Logger.defaultLogError("AsyncProcedure.finish threw for " + procedure, throwable);
+ } finally {
+ barrier.dec();
}
}
public void exception(AsyncReadGraph graph, Throwable t) {
this.exception = t;
try {
- if (procedure != null) procedure.exception(graph, t);
+ if (procedure != null) procedure.exception(procedureGraph, t);
} catch (Throwable throwable) {
Logger.defaultLogError("AsyncProcedure.exception threw for " + procedure, throwable);
} finally {
- this.graph.asyncBarrier.dec();
+ barrier.dec();
}
}
@SuppressWarnings("unchecked")
public Result get() throws DatabaseException {
- graph.asyncBarrier.waitBarrier(key, graph);
+
+ barrier.waitBarrier(key, procedureGraph);
+
if (exception != null) {
if (exception instanceof DatabaseException) throw (DatabaseException) exception;
throw new DatabaseException(exception);
} else {
return (Result) result;
}
+
}
@SuppressWarnings("unchecked")