| /* |
| * Copyright (C) 2016, Google Inc. and others |
| * |
| * This program and the accompanying materials are made available under the |
| * terms of the Eclipse Distribution License v. 1.0 which is available at |
| * https://www.eclipse.org/org/documents/edl-v10.php. |
| * |
| * SPDX-License-Identifier: BSD-3-Clause |
| */ |
| |
| package org.eclipse.jgit.util.time; |
| |
| import static java.util.concurrent.TimeUnit.MICROSECONDS; |
| import static java.util.concurrent.TimeUnit.MILLISECONDS; |
| |
| import java.time.Duration; |
| import java.util.concurrent.TimeUnit; |
| import java.util.concurrent.atomic.AtomicLong; |
| |
| /** |
| * A {@link org.eclipse.jgit.util.time.MonotonicClock} based on |
| * {@code System.currentTimeMillis}. |
| * |
| * @since 4.6 |
| */ |
| public class MonotonicSystemClock implements MonotonicClock { |
| private static final AtomicLong before = new AtomicLong(); |
| |
| private static long nowMicros() { |
| long now = MILLISECONDS.toMicros(System.currentTimeMillis()); |
| for (;;) { |
| long o = before.get(); |
| long n = Math.max(o + 1, now); |
| if (before.compareAndSet(o, n)) { |
| return n; |
| } |
| } |
| } |
| |
| @Override |
| public ProposedTimestamp propose() { |
| final long u = nowMicros(); |
| return new ProposedTimestamp() { |
| @Override |
| public long read(TimeUnit unit) { |
| return unit.convert(u, MICROSECONDS); |
| } |
| |
| @Override |
| public void blockUntil(Duration maxWait) { |
| // Assume system clock never goes backwards. |
| } |
| }; |
| } |
| } |