org.infinispan.util.concurrent.locks.PendingLockPromise Maven / Gradle / Ivy
package org.infinispan.util.concurrent.locks;
/**
* A promise returned by {@link PendingLockManager}.
*
* When a transaction need to wait for older topology transaction, this class allows it to check the state. If the
* transaction does not need to wait, or all older transactions have finished or have timed out, the {@link #isReady()}
* method returns {@code true}. Also, it allows the caller to add listeners to be notified when it is ready.
*
* @author Pedro Ruivo
* @since 8.0
*/
public interface PendingLockPromise {
PendingLockPromise NO_OP = new PendingLockPromise() {
@Override
public boolean isReady() {
return true;
}
@Override
public void addListener(PendingLockListener listener) {
listener.onReady();
}
@Override
public boolean hasTimedOut() {
return false;
}
@Override
public long getRemainingTimeout() {
throw new UnsupportedOperationException("This should never happen!");
}
@Override
public String toString() {
return "NO_OP";
}
};
/**
* @return {@code true} when the transaction has finished the waiting.
*/
boolean isReady();
/**
* Adds a listener to this promise.
*
* The listener must be non-null and it is invoked only once. If {@link #isReady()} returns {@code true}, the {@code
* listener} is immediately invoked in the invoker thread.
*
* @param listener the {@link PendingLockListener} to add.
*/
void addListener(PendingLockListener listener);
/**
* @return {@code true} if the time out happened while waiting for older transactions.
*/
boolean hasTimedOut();
/**
* @return the remaining timeout. It is zero when {@link #hasTimedOut()} is {@code true}.
*/
long getRemainingTimeout();
}