X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.db.impl%2Fsrc%2Forg%2Fsimantics%2Fdb%2Fimpl%2Fquery%2FQueryProcessor.java;fp=bundles%2Forg.simantics.db.impl%2Fsrc%2Forg%2Fsimantics%2Fdb%2Fimpl%2Fquery%2FQueryProcessor.java;h=a46bc0e8dd4e1b024dea3b0dd8d7269b10a19192;hp=eaaa9b3730976265c0673dc4547bbe35b3d4904c;hb=a88c02c2d0f4250caf887a130b9f4314c6564722;hpb=785f638bab44e70ec6103c3891daea95bcda9a07 diff --git a/bundles/org.simantics.db.impl/src/org/simantics/db/impl/query/QueryProcessor.java b/bundles/org.simantics.db.impl/src/org/simantics/db/impl/query/QueryProcessor.java index eaaa9b373..a46bc0e8d 100644 --- a/bundles/org.simantics.db.impl/src/org/simantics/db/impl/query/QueryProcessor.java +++ b/bundles/org.simantics.db.impl/src/org/simantics/db/impl/query/QueryProcessor.java @@ -141,10 +141,6 @@ final public class QueryProcessor extends AbstractDisposable implements ReadGrap final public QueryListening listening = new QueryListening(this); QueryThread[] executors; - - public LinkedList freeScheduling = new LinkedList(); - - public LinkedList topLevelTasks = new LinkedList(); enum ThreadState { @@ -152,6 +148,8 @@ final public class QueryProcessor extends AbstractDisposable implements ReadGrap } + final Scheduling scheduling; + public ThreadState[] threadStates; final Object querySupportLock; @@ -161,26 +159,13 @@ final public class QueryProcessor extends AbstractDisposable implements ReadGrap public void close() { } - public SessionTask getSubTask(ReadGraphImpl parent) { - synchronized(querySupportLock) { - int index = 0; - while(index < freeScheduling.size()) { - SessionTask task = freeScheduling.get(index); - if(task.isSubtask(parent) && task.maybeReady()) { - return freeScheduling.remove(index); - } - index++; - } - } - return null; - } /* * We are running errands while waiting for requests to complete. * We can only run work that is part of the current root request to avoid any deadlocks */ public boolean performPending(ReadGraphImpl under) { - SessionTask task = getSubTask(under); + SessionTask task = scheduling.getSubTask(under); if(task != null) { task.run(thread.get()); return true; @@ -195,28 +180,8 @@ final public class QueryProcessor extends AbstractDisposable implements ReadGrap } final public SessionTask scheduleOrReturnForExecution(SessionTask request) { - - assert(request != null); - - synchronized(querySupportLock) { - - LinkedList queue = request.rootGraph != null ? freeScheduling : topLevelTasks; - - if(BarrierTracing.BOOKKEEPING) { - Exception current = new Exception(); - Exception previous = BarrierTracing.tasks.put(request, current); - if(previous != null) { - previous.printStackTrace(); - current.printStackTrace(); - } - } - - queue.addFirst(request); - requests.release(); - - } - - return null; + + return scheduling.scheduleOrReturnForExecution(request); } @@ -298,6 +263,8 @@ final public class QueryProcessor extends AbstractDisposable implements ReadGrap THREADS = threads; THREAD_MASK = threads - 1; + scheduling = new Scheduling(requests); + querySupport = core; cache = new QueryCache(core, threads); session = querySupport.getSession(); @@ -1888,12 +1855,12 @@ final public class QueryProcessor extends AbstractDisposable implements ReadGrap Exception callerException = null; - public interface AsyncBarrier { - public void inc(); - public void dec(); - // public void inc(String debug); - // public void dec(String debug); - } + public interface AsyncBarrier { + public void inc(); + public void dec(); + public void waitBarrier(Object request, ReadGraphImpl impl); + public boolean isBlocking(); + } // final public QueryProcessor processor; // final public QuerySupport support;