Fix Future task waiting logic. Fixes BUKKIT-2408

Previously, the timeout would erroneously get converted to milliseconds
twice. The second conversion was removed.

Spurious wakeups were not handled properly, and would instead throw a
TimeoutException even if the waited time was not reached..
This commit is contained in:
Wesley Wolfe 2012-08-26 10:25:11 -05:00
parent cb84d6b994
commit 3307d489da

View file

@ -48,14 +48,19 @@ class CraftFuture<T> extends CraftTask implements Future<T> {
public synchronized T get(long timeout, final TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException {
timeout = unit.toMillis(timeout);
long period = this.getPeriod();
long timestamp = timeout > 0 ? System.currentTimeMillis() : 0l;
while (true) {
if (period == -1l || period == -3l) {
this.wait(unit.toMillis(timeout));
this.wait(timeout);
period = this.getPeriod();
if (period == -1l || period == -3l) {
if (timeout == 0l) {
continue;
}
timeout += timestamp - (timestamp = System.currentTimeMillis());
if (timeout > 0) {
continue;
}
throw new TimeoutException();
}
}