]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.db.impl/src/org/simantics/db/impl/query/QueryProcessor.java
DB request scheduling scheme fails with district diagrams
[simantics/platform.git] / bundles / org.simantics.db.impl / src / org / simantics / db / impl / query / QueryProcessor.java
index eaaa9b3730976265c0673dc4547bbe35b3d4904c..a46bc0e8dd4e1b024dea3b0dd8d7269b10a19192 100644 (file)
@@ -141,10 +141,6 @@ final public class QueryProcessor extends AbstractDisposable implements ReadGrap
        final public QueryListening                            listening = new QueryListening(this);
 
        QueryThread[]                                   executors;
-       
-       public LinkedList<SessionTask>                           freeScheduling = new LinkedList<SessionTask>();
-    
-    public LinkedList<SessionTask>                           topLevelTasks = new LinkedList<SessionTask>();
 
        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<SessionTask> 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;