Giving 30 seconds max for the thread
The plugin will wait 30 seconds and if the thread is still alive then it interrupts the thread which should instantly end the loop. Also other fixes Also notifying all threads that could wait on the queue, though it should be the only 1 BS thread
This commit is contained in:
parent
cd7b7a550d
commit
24ed3393d3
1 changed files with 20 additions and 17 deletions
|
@ -23,10 +23,11 @@ public class ThreadLink {
|
||||||
private static final int COUNT_ERROR_QUEUE = 20;
|
private static final int COUNT_ERROR_QUEUE = 20;
|
||||||
private static final int QUEUE_TIMING_DURATION = 500; // ms
|
private static final int QUEUE_TIMING_DURATION = 500; // ms
|
||||||
private static final int STARTUP_TIMING = 30000; // ms
|
private static final int STARTUP_TIMING = 30000; // ms
|
||||||
|
private static final int THREAD_SHUTDOWN_WAIT_MS = 30000;
|
||||||
private long lastTimeout;
|
private long lastTimeout;
|
||||||
private Stack<Action> updateQueue = new Stack<Action>();
|
private final Stack<Action> updateQueue = new Stack<Action>();
|
||||||
|
|
||||||
private boolean shutdown = false;
|
private boolean shutdown;
|
||||||
private ModuleLogger log;
|
private ModuleLogger log;
|
||||||
private ThreadedModel model;
|
private ThreadedModel model;
|
||||||
private Thread thread;
|
private Thread thread;
|
||||||
|
@ -85,6 +86,7 @@ public class ThreadLink {
|
||||||
for (Action act : acts) {
|
for (Action act : acts) {
|
||||||
if (!shutdown || !(act instanceof CacheChunkAction)) {
|
if (!shutdown || !(act instanceof CacheChunkAction)) {
|
||||||
if (act instanceof CallableAction) {
|
if (act instanceof CallableAction) {
|
||||||
|
//noinspection SynchronizationOnLocalVariableOrMethodParameter
|
||||||
synchronized (act) {
|
synchronized (act) {
|
||||||
act.process(ThreadLink.this, this.q);
|
act.process(ThreadLink.this, this.q);
|
||||||
act.notify();
|
act.notify();
|
||||||
|
@ -98,7 +100,7 @@ public class ThreadLink {
|
||||||
log.debug("DB-Thread '" + Thread.currentThread().getName() + "' execution time: " + (System.currentTimeMillis() - t) + "ms");
|
log.debug("DB-Thread '" + Thread.currentThread().getName() + "' execution time: " + (System.currentTimeMillis() - t) + "ms");
|
||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
log.severe("DB-Thread '" + Thread.currentThread().getName() + "' was harmfull interupted");
|
log.severe("DB-Thread '" + Thread.currentThread().getName() + "' was harmfully interupted");
|
||||||
}
|
}
|
||||||
Thread.yield();
|
Thread.yield();
|
||||||
}
|
}
|
||||||
|
@ -106,7 +108,7 @@ public class ThreadLink {
|
||||||
log.debug("DB-Thread " + Thread.currentThread().getName() + " finished.");
|
log.debug("DB-Thread " + Thread.currentThread().getName() + " finished.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void start() {
|
public void start() {
|
||||||
shutdown = false;
|
shutdown = false;
|
||||||
if (!thread.isAlive())
|
if (!thread.isAlive())
|
||||||
|
@ -119,11 +121,11 @@ public class ThreadLink {
|
||||||
long l = System.currentTimeMillis();
|
long l = System.currentTimeMillis();
|
||||||
synchronized (updateQueue) {
|
synchronized (updateQueue) {
|
||||||
updateQueue.add(new UpdateBlockStateAction(block));
|
updateQueue.add(new UpdateBlockStateAction(block));
|
||||||
updateQueue.notify();
|
updateQueue.notifyAll();
|
||||||
}
|
}
|
||||||
long l2 = System.currentTimeMillis();
|
long l2 = System.currentTimeMillis();
|
||||||
if (l2 - l > QUEUE_ACCESS_WARNING_DURATION) {
|
if (l2 - l > QUEUE_ACCESS_WARNING_DURATION) {
|
||||||
getLog().warn("queueUpdate-action took to long: " + (l - 2) + "ms");
|
getLog().warn("queueUpdate-action took too long: " + (l2 - l) + "ms");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -132,7 +134,7 @@ public class ThreadLink {
|
||||||
FetchBlockStateAction action = new FetchBlockStateAction(block);
|
FetchBlockStateAction action = new FetchBlockStateAction(block);
|
||||||
synchronized (updateQueue) {
|
synchronized (updateQueue) {
|
||||||
updateQueue.push(action);
|
updateQueue.push(action);
|
||||||
updateQueue.notify();
|
updateQueue.notifyAll();
|
||||||
}
|
}
|
||||||
return action.getValue();
|
return action.getValue();
|
||||||
}
|
}
|
||||||
|
@ -141,14 +143,14 @@ public class ThreadLink {
|
||||||
restartThreadIfNeeded();
|
restartThreadIfNeeded();
|
||||||
synchronized (updateQueue) {
|
synchronized (updateQueue) {
|
||||||
updateQueue.add(act);
|
updateQueue.add(act);
|
||||||
updateQueue.notify();
|
updateQueue.notifyAll();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public <T> T call(CallableAction<T> act) {
|
public <T> T call(CallableAction<T> act) {
|
||||||
restartThreadIfNeeded();
|
restartThreadIfNeeded();
|
||||||
synchronized (updateQueue) {
|
synchronized (updateQueue) {
|
||||||
updateQueue.push(act);
|
updateQueue.push(act);
|
||||||
updateQueue.notify();
|
updateQueue.notifyAll();
|
||||||
}
|
}
|
||||||
return act.getValue();
|
return act.getValue();
|
||||||
}
|
}
|
||||||
|
@ -157,7 +159,7 @@ public class ThreadLink {
|
||||||
FetchCuboidAction action = new FetchCuboidAction(c);
|
FetchCuboidAction action = new FetchCuboidAction(c);
|
||||||
synchronized (updateQueue) {
|
synchronized (updateQueue) {
|
||||||
updateQueue.push(action);
|
updateQueue.push(action);
|
||||||
updateQueue.notify();
|
updateQueue.notifyAll();
|
||||||
}
|
}
|
||||||
return action.getValue();
|
return action.getValue();
|
||||||
}
|
}
|
||||||
|
@ -166,7 +168,7 @@ public class ThreadLink {
|
||||||
restartThreadIfNeeded();
|
restartThreadIfNeeded();
|
||||||
synchronized (updateQueue) {
|
synchronized (updateQueue) {
|
||||||
updateQueue.add(new MoveBlockStateAction(from, to));
|
updateQueue.add(new MoveBlockStateAction(from, to));
|
||||||
updateQueue.notify();
|
updateQueue.notifyAll();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -174,7 +176,7 @@ public class ThreadLink {
|
||||||
restartThreadIfNeeded();
|
restartThreadIfNeeded();
|
||||||
synchronized (updateQueue) {
|
synchronized (updateQueue) {
|
||||||
updateQueue.add(new CacheChunkAction(chunk));
|
updateQueue.add(new CacheChunkAction(chunk));
|
||||||
updateQueue.notify();
|
updateQueue.notifyAll();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -182,17 +184,18 @@ public class ThreadLink {
|
||||||
restartThreadIfNeeded();
|
restartThreadIfNeeded();
|
||||||
synchronized (updateQueue) {
|
synchronized (updateQueue) {
|
||||||
updateQueue.add(transaction);
|
updateQueue.add(transaction);
|
||||||
updateQueue.notify();
|
updateQueue.notifyAll();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void shutdown() throws InterruptedException {
|
public void shutdown() throws InterruptedException {
|
||||||
restartThreadIfNeeded();
|
|
||||||
synchronized (updateQueue) {
|
synchronized (updateQueue) {
|
||||||
shutdown = true;
|
shutdown = true;
|
||||||
updateQueue.notify();
|
updateQueue.notifyAll();
|
||||||
}
|
}
|
||||||
thread.join();
|
thread.join(THREAD_SHUTDOWN_WAIT_MS);
|
||||||
|
if (thread.isAlive())
|
||||||
|
thread.interrupt(); //Wake it up
|
||||||
}
|
}
|
||||||
|
|
||||||
public HasBlockState getMetaState(Block block) {
|
public HasBlockState getMetaState(Block block) {
|
||||||
|
|
Loading…
Reference in a new issue