mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-02 04:56:50 +01:00
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:
parent
cb84d6b994
commit
3307d489da
1 changed files with 6 additions and 1 deletions
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue