package com.zillabyte.motherbrain.utils.backoff;
import java.io.Serializable;
import com.zillabyte.motherbrain.utils.SerializableMonitor;
public abstract class BackoffTicker implements Serializable {
private static final long serialVersionUID = -700196649719730495L;
public static final long DEFAULT_INITIAL_VALUE = 0L;
public static final long DEFAULT_UPPER_BOUND = Long.MAX_VALUE;
long _counter;
final SerializableMonitor counterMonitor;
final long _upperBound;
BackoffTicker(long counter, long upperBound) {
this._counter = counter;
this._upperBound = upperBound;
this.counterMonitor = new SerializableMonitor();
}
public BackoffTicker() {
this(DEFAULT_INITIAL_VALUE, DEFAULT_UPPER_BOUND);
}
/***
*
* @param upperBound
*/
public BackoffTicker(long upperBound) {
this(DEFAULT_INITIAL_VALUE, upperBound);
}
/**
* This is NOT thread-safe and may return an inaccurate count.
*/
public long counter() {
return _counter;
}
protected abstract boolean handleTick(long counter);
public boolean tick() {
synchronized (counterMonitor) {
this._counter++;
return (_counter % _upperBound == 0) || handleTick(_counter);
}
}
}