package org.infinispan.atomic.container; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; /* * @author Pierre Sutra * @since 7.2 */ class CallFuture implements Future<Object> { private Object ret; private int state; // 0 => init, 1 => done, -1 => cancelled public CallFuture(){ ret = null; state = 0; } public void setReturnValue(Object r){ synchronized (this) { if (state == -1) return ; if (ret == null) { ret = r; state = 1; this.notifyAll(); return; } } throw new IllegalStateException("Unreachable code"); } @Override public boolean cancel(boolean mayInterruptIfRunning) { synchronized (this) { if (state != 0) return false; state = -1; if (mayInterruptIfRunning) this.notifyAll(); } return true; } @Override public Object get() throws InterruptedException, ExecutionException { synchronized (this) { if (state == 0) this.wait(); } return (state == -1) ? null : ret; } @Override public Object get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { synchronized (this) { if (state == 0) this.wait(timeout); } return (state == -1) ? null : ret; } @Override public boolean isCancelled() { return state == -1; } @Override public boolean isDone() { return state == 1; } }