X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.db.impl%2Fsrc%2Forg%2Fsimantics%2Fdb%2Fimpl%2Fquery%2FQueryThread.java;h=79124893137d67dc058892edce823eb993ed939c;hb=0837081ba3e7bd690e1663bd1578b8f8848d4e86;hp=ab10efa0baab252a1ff5ef8b8485c313b2b32db1;hpb=5825284fd6530d5c4e983bf611ac7c3a9e584c9f;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.db.impl/src/org/simantics/db/impl/query/QueryThread.java b/bundles/org.simantics.db.impl/src/org/simantics/db/impl/query/QueryThread.java index ab10efa0b..791248931 100644 --- a/bundles/org.simantics.db.impl/src/org/simantics/db/impl/query/QueryThread.java +++ b/bundles/org.simantics.db.impl/src/org/simantics/db/impl/query/QueryThread.java @@ -2,6 +2,7 @@ package org.simantics.db.impl.query; import java.util.ArrayList; import java.util.concurrent.Semaphore; +import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import org.simantics.db.Session; @@ -33,6 +34,8 @@ class QueryThread extends Thread implements SessionThread { final private int THREADS; final private AtomicInteger sleepers; final private ThreadState[] threadStates; + + private SessionTask currentTask; // final private ArrayList[] delayQueues; // final private QueryThread[] executors; // final private ReentrantLock[] threadLocks; @@ -71,7 +74,12 @@ class QueryThread extends Thread implements SessionThread { // lock.unlock(); try { - exited.acquire(); + // we are not willing to wait forever here.. + boolean acquired = exited.tryAcquire(60, TimeUnit.SECONDS); + if (!acquired) { + LOGGER.error("Could not safely dispose query thread {} - we were processing task {} and still have tasks to do {}", index, currentTask.graph != null ? String.valueOf(currentTask) : "SessionTask with null graph", tasks.size()); + interrupt(); + } } catch (InterruptedException e) { LOGGER.error("dispose was interrupted", e); } @@ -215,14 +223,15 @@ class QueryThread extends Thread implements SessionThread { while(!tasks.isEmpty()) { - SessionTask task = tasks.remove(tasks.size() - 1); + SessionTask t = currentTask = tasks.remove(tasks.size() - 1); // if(task.syncCaller == index) { // ownSyncTasks[index].add(task); // } else { - task.run(index); + t.run(index); // System.err.println("QT(s) " + index + " runs " + task); didExecute = true; + currentTask = null; // } } @@ -249,10 +258,10 @@ class QueryThread extends Thread implements SessionThread { while(!tasks.isEmpty()) { - SessionTask task = tasks.remove(tasks.size()-1); + SessionTask t = currentTask = tasks.remove(tasks.size()-1); // System.err.println("QT " + index + " runs " + task); - task.run(index); - + t.run(index); + currentTask = null; } // for(int performer=0;performer