mirror of
https://github.com/OpenHFT/Chronicle-Map.git
synced 2021-09-13 01:26:12 +00:00
Make NanosecondPrecisionSystemTimeProvider monotonic
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user