Make NanosecondPrecisionSystemTimeProvider monotonic

This commit is contained in:
leventov
2015-12-27 01:53:57 +03:00
parent 2928d18d11
commit 123fb177c6
2 changed files with 12 additions and 2 deletions
@@ -396,7 +396,7 @@ public interface ChronicleHashBuilder<K, H extends ChronicleHash<K, ?, ?, ?>,
* replication consensus protocol (conflicting data updates resolution).
*
* <p>Default time provider uses system time ({@link System#currentTimeMillis()}) in
* <i>nanosecond</i> precision.
* <i>nanosecond</i> precision, also it returns non-decreasing time.
*
* @param timeProvider a new time provider for replication needs
* @return this builder back
@@ -20,6 +20,7 @@ import net.openhft.chronicle.hash.replication.TimeProvider;
import java.io.ObjectStreamException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;
import static java.util.concurrent.TimeUnit.NANOSECONDS;
import static java.util.concurrent.TimeUnit.MILLISECONDS;
@@ -27,6 +28,8 @@ import static java.util.concurrent.TimeUnit.MILLISECONDS;
final class NanosecondPrecisionSystemTimeProvider extends TimeProvider {
private static final long serialVersionUID = 0L;
private static final AtomicLong lastTimeHolder = new AtomicLong();
private static final NanosecondPrecisionSystemTimeProvider INSTANCE =
new NanosecondPrecisionSystemTimeProvider();
@@ -38,7 +41,14 @@ final class NanosecondPrecisionSystemTimeProvider extends TimeProvider {
@Override
public long currentTime() {
return MILLISECONDS.toNanos(System.currentTimeMillis());
long now = MILLISECONDS.toNanos(System.currentTimeMillis());
while (true) {
long lastTime = lastTimeHolder.get();
if (now <= lastTime)
return lastTime;
if (lastTimeHolder.compareAndSet(lastTime, now))
return now;
}
}
@Override