X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.db.impl%2Fsrc%2Forg%2Fsimantics%2Fdb%2Fimpl%2Fquery%2FReadEntry.java;h=72f132288bf79990c5bf56ce591463993ccd8acd;hb=497f90316cb17b5bbd8f8b72af3ab3bb6582a902;hp=c95242defc77a45ae859f49042a2fc1e13df4f20;hpb=9f0fd59be54719b1fe9322d8fd37e4950857308c;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.db.impl/src/org/simantics/db/impl/query/ReadEntry.java b/bundles/org.simantics.db.impl/src/org/simantics/db/impl/query/ReadEntry.java index c95242def..72f132288 100644 --- a/bundles/org.simantics.db.impl/src/org/simantics/db/impl/query/ReadEntry.java +++ b/bundles/org.simantics.db.impl/src/org/simantics/db/impl/query/ReadEntry.java @@ -25,20 +25,20 @@ public final class ReadEntry extends CacheEntryBase> implem private static final Logger LOGGER = LoggerFactory.getLogger(ReadEntry.class); - protected Read request; + protected Read id; public ReadEntry(Read request) { - this.request = request; + this.id = request; } @Override int makeHash() { - return request.hashCode(); + return id.hashCode(); } @Override public Object getOriginalRequest() { - return request; + return id; } @Override @@ -57,7 +57,7 @@ public final class ReadEntry extends CacheEntryBase> implem try { - T result = request.perform(graph); + T result = id.perform(graph); setResult(result); setReady(); @@ -76,8 +76,8 @@ public final class ReadEntry extends CacheEntryBase> implem @Override public int type() { - if (request instanceof ReadExt) { - return ((ReadExt) request).getType(); + if (id instanceof ReadExt) { + return ((ReadExt) id).getType(); } else { return RequestFlags.INVALIDATE; } @@ -85,74 +85,106 @@ public final class ReadEntry extends CacheEntryBase> implem @Override public String toString() { - if (request == null) + if (id == null) return "DISCARDED"; else - return request.toString() + statusOrException; + return id.toString() + statusOrException; } }; } - public static void computeForEach(ReadGraphImpl graph, Read request, ReadEntry entry, - AsyncProcedure procedure_) throws DatabaseException { + public static T computeForEach(ReadGraphImpl graph, Read request, ReadEntry entry, + AsyncProcedure procedure_, boolean needsToBlock) throws DatabaseException { AsyncProcedure procedure = entry != null ? entry : procedure_; - ReadGraphImpl queryGraph = entry != null ? graph.withParent(entry) : graph; + ReadGraphImpl queryGraph = graph.withParent(entry); + queryGraph.asyncBarrier.inc(); + ReadGraphImpl executeGraph = graph.withParent(graph.parent); + executeGraph.asyncBarrier.inc(); + try { + // This throws T result = request.perform(queryGraph); - procedure.execute(graph, result); + + if(procedure != null) procedure.execute(executeGraph, result); + return (T)result; } catch (DatabaseException e) { - procedure.exception(graph, e); + if(procedure != null) procedure.exception(executeGraph, e); + throw e; } catch (Throwable t) { DatabaseException dbe = new DatabaseException(t); - procedure.exception(graph, dbe); + if(procedure != null) procedure.exception(executeGraph, dbe); + throw dbe; - } + } finally { + + queryGraph.asyncBarrier.dec(); + + try { + + if (entry != null) { + // This also throws so must dec barrier finally + entry.performFromCache(executeGraph, procedure_); + } + + } finally { + + executeGraph.asyncBarrier.dec(); + executeGraph.asyncBarrier.waitBarrier(procedure, executeGraph); - if (entry != null) - entry.performFromCache(queryGraph, procedure_); + } + + + } } - public Object performFromCache(ReadGraphImpl graph, AsyncProcedure procedure) { + public Object performFromCache(ReadGraphImpl graph, AsyncProcedure procedure) throws DatabaseException { AsyncProcedure proc = (AsyncProcedure) procedure; - if (proc != null) { - if (isExcepted()) { - try { - proc.exception(graph, (Throwable) getResult()); - } catch (Throwable t) { - LOGGER.error("performFromCache proc.exception failed", t); + if (isExcepted()) { + if(proc != null) { + try { + proc.exception(graph, (Throwable) getResult()); + } catch (Throwable t) { + LOGGER.error("performFromCache proc.exception failed", t); + } } - } else { - try { - proc.execute(graph, (T) getResult()); - } catch (Throwable t) { - LOGGER.error("performFromCache proc.execute failed", t); + Throwable t = (Throwable) getResult(); + if(t instanceof DatabaseException) { + throw (DatabaseException)t; + } else { + throw new DatabaseException(t); } - } + } else { + if(proc != null) { + try { + proc.execute(graph, (T) getResult()); + } catch (Throwable t) { + LOGGER.error("performFromCache proc.execute failed", t); + } + } + return (T)getResult(); } - return (T) getResult(); - } @Override public String toString() { - if (request == null) + if (id == null) return "DISCARDED"; else - return request.toString() + " - " + statusOrException; + return id.toString() + " - " + statusOrException; } public Object get(ReadGraphImpl graph, AsyncProcedure procedure) throws DatabaseException { @@ -164,8 +196,8 @@ public final class ReadEntry extends CacheEntryBase> implem @Override boolean isImmutable(ReadGraphImpl graph) throws DatabaseException { - if (request instanceof ReadExt) { - return ((ReadExt) request).isImmutable(graph); + if (id instanceof ReadExt) { + return ((ReadExt) id).isImmutable(graph); } return false; }