Move QuicClock to third_party/quic/core.
It has never had a platform impl, and thus should not be in quic/platform/api.
gfe-relnote: n/a (no functional change)
PiperOrigin-RevId: 294522346
Change-Id: Ibba0760f4a5a8c9a59c5eb3796b17f11f8a1a87d
diff --git a/quic/core/congestion_control/cubic_bytes.h b/quic/core/congestion_control/cubic_bytes.h
index 2bbd04c..0e174a8 100644
--- a/quic/core/congestion_control/cubic_bytes.h
+++ b/quic/core/congestion_control/cubic_bytes.h
@@ -11,9 +11,9 @@
#include <cstdint>
#include "net/third_party/quiche/src/quic/core/quic_bandwidth.h"
+#include "net/third_party/quiche/src/quic/core/quic_clock.h"
#include "net/third_party/quiche/src/quic/core/quic_connection_stats.h"
#include "net/third_party/quiche/src/quic/core/quic_time.h"
-#include "net/third_party/quiche/src/quic/platform/api/quic_clock.h"
#include "net/third_party/quiche/src/quic/platform/api/quic_export.h"
namespace quic {
diff --git a/quic/core/congestion_control/send_algorithm_interface.h b/quic/core/congestion_control/send_algorithm_interface.h
index 33ab222..a049e67 100644
--- a/quic/core/congestion_control/send_algorithm_interface.h
+++ b/quic/core/congestion_control/send_algorithm_interface.h
@@ -13,13 +13,13 @@
#include "net/third_party/quiche/src/quic/core/crypto/quic_random.h"
#include "net/third_party/quiche/src/quic/core/quic_bandwidth.h"
+#include "net/third_party/quiche/src/quic/core/quic_clock.h"
#include "net/third_party/quiche/src/quic/core/quic_config.h"
#include "net/third_party/quiche/src/quic/core/quic_connection_stats.h"
#include "net/third_party/quiche/src/quic/core/quic_packets.h"
#include "net/third_party/quiche/src/quic/core/quic_time.h"
#include "net/third_party/quiche/src/quic/core/quic_types.h"
#include "net/third_party/quiche/src/quic/core/quic_unacked_packet_map.h"
-#include "net/third_party/quiche/src/quic/platform/api/quic_clock.h"
#include "net/third_party/quiche/src/quic/platform/api/quic_export.h"
namespace quic {
diff --git a/quic/core/crypto/quic_crypto_server_config.cc b/quic/core/crypto/quic_crypto_server_config.cc
index 8ab550c..4dc34ff 100644
--- a/quic/core/crypto/quic_crypto_server_config.cc
+++ b/quic/core/crypto/quic_crypto_server_config.cc
@@ -33,13 +33,13 @@
#include "net/third_party/quiche/src/quic/core/crypto/tls_server_connection.h"
#include "net/third_party/quiche/src/quic/core/proto/crypto_server_config_proto.h"
#include "net/third_party/quiche/src/quic/core/proto/source_address_token_proto.h"
+#include "net/third_party/quiche/src/quic/core/quic_clock.h"
#include "net/third_party/quiche/src/quic/core/quic_packets.h"
#include "net/third_party/quiche/src/quic/core/quic_socket_address_coder.h"
#include "net/third_party/quiche/src/quic/core/quic_types.h"
#include "net/third_party/quiche/src/quic/core/quic_utils.h"
#include "net/third_party/quiche/src/quic/platform/api/quic_bug_tracker.h"
#include "net/third_party/quiche/src/quic/platform/api/quic_cert_utils.h"
-#include "net/third_party/quiche/src/quic/platform/api/quic_clock.h"
#include "net/third_party/quiche/src/quic/platform/api/quic_fallthrough.h"
#include "net/third_party/quiche/src/quic/platform/api/quic_flag_utils.h"
#include "net/third_party/quiche/src/quic/platform/api/quic_flags.h"
diff --git a/quic/core/quic_buffered_packet_store.h b/quic/core/quic_buffered_packet_store.h
index 09bc2cc..dbf3faf 100644
--- a/quic/core/quic_buffered_packet_store.h
+++ b/quic/core/quic_buffered_packet_store.h
@@ -10,9 +10,9 @@
#include "net/third_party/quiche/src/quic/core/quic_alarm.h"
#include "net/third_party/quiche/src/quic/core/quic_alarm_factory.h"
+#include "net/third_party/quiche/src/quic/core/quic_clock.h"
#include "net/third_party/quiche/src/quic/core/quic_packets.h"
#include "net/third_party/quiche/src/quic/core/quic_time.h"
-#include "net/third_party/quiche/src/quic/platform/api/quic_clock.h"
#include "net/third_party/quiche/src/quic/platform/api/quic_containers.h"
#include "net/third_party/quiche/src/quic/platform/api/quic_export.h"
#include "net/third_party/quiche/src/quic/platform/api/quic_socket_address.h"
diff --git a/quic/core/quic_clock.cc b/quic/core/quic_clock.cc
new file mode 100644
index 0000000..e2287e9
--- /dev/null
+++ b/quic/core/quic_clock.cc
@@ -0,0 +1,70 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "net/third_party/quiche/src/quic/core/quic_clock.h"
+
+#include <limits>
+
+#include "net/third_party/quiche/src/quic/platform/api/quic_logging.h"
+
+namespace quic {
+
+QuicClock::QuicClock()
+ : is_calibrated_(false), calibration_offset_(QuicTime::Delta::Zero()) {}
+
+QuicClock::~QuicClock() {}
+
+QuicTime::Delta QuicClock::ComputeCalibrationOffset() const {
+ // In the ideal world, all we need to do is to return the difference of
+ // WallNow() and Now(). In the real world, things like context switch may
+ // happen between the calls to WallNow() and Now(), causing their difference
+ // to be arbitrarily large, so we repeat the calculation many times and use
+ // the one with the minimum difference as the true offset.
+ int64_t min_offset_us = std::numeric_limits<int64_t>::max();
+
+ for (int i = 0; i < 128; ++i) {
+ int64_t now_in_us = (Now() - QuicTime::Zero()).ToMicroseconds();
+ int64_t wallnow_in_us =
+ static_cast<int64_t>(WallNow().ToUNIXMicroseconds());
+
+ int64_t offset_us = wallnow_in_us - now_in_us;
+ if (offset_us < min_offset_us) {
+ min_offset_us = offset_us;
+ }
+ }
+
+ return QuicTime::Delta::FromMicroseconds(min_offset_us);
+}
+
+void QuicClock::SetCalibrationOffset(QuicTime::Delta offset) {
+ DCHECK(!is_calibrated_) << "A clock should only be calibrated once";
+ calibration_offset_ = offset;
+ is_calibrated_ = true;
+}
+
+QuicTime QuicClock::ConvertWallTimeToQuicTime(
+ const QuicWallTime& walltime) const {
+ if (is_calibrated_) {
+ int64_t time_in_us = static_cast<int64_t>(walltime.ToUNIXMicroseconds()) -
+ calibration_offset_.ToMicroseconds();
+ return QuicTime::Zero() + QuicTime::Delta::FromMicroseconds(time_in_us);
+ }
+
+ // ..........................
+ // | | |
+ // unix epoch |walltime| WallNow()
+ // ..........................
+ // | | |
+ // clock epoch | Now()
+ // result
+ //
+ // result = Now() - (WallNow() - walltime)
+ return Now() - QuicTime::Delta::FromMicroseconds(
+ WallNow()
+ .Subtract(QuicTime::Delta::FromMicroseconds(
+ walltime.ToUNIXMicroseconds()))
+ .ToUNIXMicroseconds());
+}
+
+} // namespace quic
diff --git a/quic/core/quic_clock.h b/quic/core/quic_clock.h
new file mode 100644
index 0000000..cef36dc
--- /dev/null
+++ b/quic/core/quic_clock.h
@@ -0,0 +1,72 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef QUICHE_QUIC_CORE_QUIC_CLOCK_H_
+#define QUICHE_QUIC_CORE_QUIC_CLOCK_H_
+
+#include "net/third_party/quiche/src/quic/core/quic_time.h"
+#include "net/third_party/quiche/src/quic/platform/api/quic_export.h"
+
+/* API_DESCRIPTION
+ QuicClock is used by QUIC core to get current time. Its instance is created by
+ applications and passed into QuicDispatcher and QuicConnectionHelperInterface.
+ API-DESCRIPTION */
+
+namespace quic {
+
+// Interface for retrieving the current time.
+class QUIC_EXPORT_PRIVATE QuicClock {
+ public:
+ QuicClock();
+ virtual ~QuicClock();
+
+ QuicClock(const QuicClock&) = delete;
+ QuicClock& operator=(const QuicClock&) = delete;
+
+ // Compute the offset between this clock with the Unix Epoch clock.
+ // Return the calibrated offset between WallNow() and Now(), in the form of
+ // (wallnow_in_us - now_in_us).
+ // The return value can be used by SetCalibrationOffset() to actually
+ // calibrate the clock, or all instances of this clock type.
+ QuicTime::Delta ComputeCalibrationOffset() const;
+
+ // Calibrate this clock. A calibrated clock guarantees that the
+ // ConvertWallTimeToQuicTime() function always return the same result for the
+ // same walltime.
+ // Should not be called more than once for each QuicClock.
+ void SetCalibrationOffset(QuicTime::Delta offset);
+
+ // Returns the approximate current time as a QuicTime object.
+ virtual QuicTime ApproximateNow() const = 0;
+
+ // Returns the current time as a QuicTime object.
+ // Note: this use significant resources please use only if needed.
+ virtual QuicTime Now() const = 0;
+
+ // WallNow returns the current wall-time - a time that is consistent across
+ // different clocks.
+ virtual QuicWallTime WallNow() const = 0;
+
+ // Converts |walltime| to a QuicTime relative to this clock's epoch.
+ virtual QuicTime ConvertWallTimeToQuicTime(
+ const QuicWallTime& walltime) const;
+
+ protected:
+ // Creates a new QuicTime using |time_us| as the internal value.
+ QuicTime CreateTimeFromMicroseconds(uint64_t time_us) const {
+ return QuicTime(time_us);
+ }
+
+ private:
+ // True if |calibration_offset_| is valid.
+ bool is_calibrated_;
+ // If |is_calibrated_|, |calibration_offset_| is the (fixed) offset between
+ // the Unix Epoch clock and this clock.
+ // In other words, the offset between WallNow() and Now().
+ QuicTime::Delta calibration_offset_;
+};
+
+} // namespace quic
+
+#endif // QUICHE_QUIC_CORE_QUIC_CLOCK_H_
diff --git a/quic/core/quic_packet_reader.h b/quic/core/quic_packet_reader.h
index e4961b9..df366eb 100644
--- a/quic/core/quic_packet_reader.h
+++ b/quic/core/quic_packet_reader.h
@@ -12,11 +12,11 @@
// regardless of how the below transitive header include set may change.
#include <sys/socket.h>
+#include "net/third_party/quiche/src/quic/core/quic_clock.h"
#include "net/third_party/quiche/src/quic/core/quic_packets.h"
#include "net/third_party/quiche/src/quic/core/quic_process_packet_interface.h"
#include "net/third_party/quiche/src/quic/core/quic_udp_socket.h"
#include "net/third_party/quiche/src/quic/platform/api/quic_aligned.h"
-#include "net/third_party/quiche/src/quic/platform/api/quic_clock.h"
#include "net/third_party/quiche/src/quic/platform/api/quic_flags.h"
#include "net/third_party/quiche/src/quic/platform/api/quic_socket_address.h"
#include "net/quic/platform/impl/quic_socket_utils.h"
diff --git a/quic/core/quic_stream_sequencer.cc b/quic/core/quic_stream_sequencer.cc
index 49f0917..79c2df7 100644
--- a/quic/core/quic_stream_sequencer.cc
+++ b/quic/core/quic_stream_sequencer.cc
@@ -10,6 +10,7 @@
#include <string>
#include <utility>
+#include "net/third_party/quiche/src/quic/core/quic_clock.h"
#include "net/third_party/quiche/src/quic/core/quic_error_codes.h"
#include "net/third_party/quiche/src/quic/core/quic_packets.h"
#include "net/third_party/quiche/src/quic/core/quic_stream.h"
@@ -17,7 +18,6 @@
#include "net/third_party/quiche/src/quic/core/quic_types.h"
#include "net/third_party/quiche/src/quic/core/quic_utils.h"
#include "net/third_party/quiche/src/quic/platform/api/quic_bug_tracker.h"
-#include "net/third_party/quiche/src/quic/platform/api/quic_clock.h"
#include "net/third_party/quiche/src/quic/platform/api/quic_flag_utils.h"
#include "net/third_party/quiche/src/quic/platform/api/quic_flags.h"
#include "net/third_party/quiche/src/quic/platform/api/quic_logging.h"
diff --git a/quic/core/quic_time_wait_list_manager.cc b/quic/core/quic_time_wait_list_manager.cc
index 5131005..2b0c267 100644
--- a/quic/core/quic_time_wait_list_manager.cc
+++ b/quic/core/quic_time_wait_list_manager.cc
@@ -12,11 +12,11 @@
#include "net/third_party/quiche/src/quic/core/crypto/crypto_protocol.h"
#include "net/third_party/quiche/src/quic/core/crypto/quic_decrypter.h"
#include "net/third_party/quiche/src/quic/core/crypto/quic_encrypter.h"
+#include "net/third_party/quiche/src/quic/core/quic_clock.h"
#include "net/third_party/quiche/src/quic/core/quic_connection_id.h"
#include "net/third_party/quiche/src/quic/core/quic_framer.h"
#include "net/third_party/quiche/src/quic/core/quic_packets.h"
#include "net/third_party/quiche/src/quic/core/quic_utils.h"
-#include "net/third_party/quiche/src/quic/platform/api/quic_clock.h"
#include "net/third_party/quiche/src/quic/platform/api/quic_flag_utils.h"
#include "net/third_party/quiche/src/quic/platform/api/quic_flags.h"
#include "net/third_party/quiche/src/quic/platform/api/quic_logging.h"