/* * 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 java.time.Duration; /** * A provider of time. *

* Clocks should provide wall clock time, obtained from a reasonable clock * source, such as the local system clock. *

* MonotonicClocks provide the following behavior, with the assertion always * being true if * {@link org.eclipse.jgit.util.time.ProposedTimestamp#blockUntil(Duration)} is * used: * *

 *   MonotonicClock clk = ...;
 *   long r1;
 *   try (ProposedTimestamp t1 = clk.propose()) {
 *   	r1 = t1.millis();
 *   	t1.blockUntil(...);
 *   }
 *
 *   try (ProposedTimestamp t2 = clk.propose()) {
 *   	assert t2.millis() > r1;
 *   }
 * 
* * @since 4.6 */ public interface MonotonicClock { /** * Obtain a timestamp close to "now". *

* Proposed times are close to "now", but may not yet be certainly in the * past. This allows the calling thread to interleave other useful work * while waiting for the clock instance to create an assurance it will never * in the future propose a time earlier than the returned time. *

* A hypothetical implementation could read the local system clock (managed * by NTP) and return that proposal, concurrently sending network messages * to closely collaborating peers in the same cluster to also ensure their * system clocks are ahead of this time. In such an implementation the * {@link org.eclipse.jgit.util.time.ProposedTimestamp#blockUntil(Duration)} * method would wait for replies from the peers indicating their own system * clocks have moved past the proposed time. * * @return a {@link org.eclipse.jgit.util.time.ProposedTimestamp} object. */ ProposedTimestamp propose(); }