Provide a default implementation of QuicClock and QuicConnectionHelperInterface.
PiperOrigin-RevId: 456835160
diff --git a/build/source_list.bzl b/build/source_list.bzl
index 4d1ff62..4f58c6a 100644
--- a/build/source_list.bzl
+++ b/build/source_list.bzl
@@ -287,6 +287,8 @@
"quic/core/quic_data_reader.h",
"quic/core/quic_data_writer.h",
"quic/core/quic_datagram_queue.h",
+ "quic/core/quic_default_clock.h",
+ "quic/core/quic_default_connection_helper.h",
"quic/core/quic_dispatcher.h",
"quic/core/quic_error_codes.h",
"quic/core/quic_flags_list.h",
@@ -613,6 +615,7 @@
"quic/core/quic_data_reader.cc",
"quic/core/quic_data_writer.cc",
"quic/core/quic_datagram_queue.cc",
+ "quic/core/quic_default_clock.cc",
"quic/core/quic_dispatcher.cc",
"quic/core/quic_error_codes.cc",
"quic/core/quic_flow_controller.cc",
diff --git a/build/source_list.gni b/build/source_list.gni
index 8658d49..5cf7491 100644
--- a/build/source_list.gni
+++ b/build/source_list.gni
@@ -287,6 +287,8 @@
"src/quiche/quic/core/quic_data_reader.h",
"src/quiche/quic/core/quic_data_writer.h",
"src/quiche/quic/core/quic_datagram_queue.h",
+ "src/quiche/quic/core/quic_default_clock.h",
+ "src/quiche/quic/core/quic_default_connection_helper.h",
"src/quiche/quic/core/quic_dispatcher.h",
"src/quiche/quic/core/quic_error_codes.h",
"src/quiche/quic/core/quic_flags_list.h",
@@ -613,6 +615,7 @@
"src/quiche/quic/core/quic_data_reader.cc",
"src/quiche/quic/core/quic_data_writer.cc",
"src/quiche/quic/core/quic_datagram_queue.cc",
+ "src/quiche/quic/core/quic_default_clock.cc",
"src/quiche/quic/core/quic_dispatcher.cc",
"src/quiche/quic/core/quic_error_codes.cc",
"src/quiche/quic/core/quic_flow_controller.cc",
diff --git a/build/source_list.json b/build/source_list.json
index cca88cb..0334858 100644
--- a/build/source_list.json
+++ b/build/source_list.json
@@ -286,6 +286,8 @@
"quiche/quic/core/quic_data_reader.h",
"quiche/quic/core/quic_data_writer.h",
"quiche/quic/core/quic_datagram_queue.h",
+ "quiche/quic/core/quic_default_clock.h",
+ "quiche/quic/core/quic_default_connection_helper.h",
"quiche/quic/core/quic_dispatcher.h",
"quiche/quic/core/quic_error_codes.h",
"quiche/quic/core/quic_flags_list.h",
@@ -612,6 +614,7 @@
"quiche/quic/core/quic_data_reader.cc",
"quiche/quic/core/quic_data_writer.cc",
"quiche/quic/core/quic_datagram_queue.cc",
+ "quiche/quic/core/quic_default_clock.cc",
"quiche/quic/core/quic_dispatcher.cc",
"quiche/quic/core/quic_error_codes.cc",
"quiche/quic/core/quic_flow_controller.cc",
diff --git a/quiche/quic/core/quic_default_clock.cc b/quiche/quic/core/quic_default_clock.cc
new file mode 100644
index 0000000..1418efb
--- /dev/null
+++ b/quiche/quic/core/quic_default_clock.cc
@@ -0,0 +1,31 @@
+// Copyright 2022 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 "quiche/quic/core/quic_default_clock.h"
+
+#include "absl/time/clock.h"
+
+namespace quic {
+
+QuicDefaultClock* QuicDefaultClock::Get() {
+ static QuicDefaultClock* clock = new QuicDefaultClock();
+ return clock;
+}
+
+QuicTime QuicDefaultClock::ApproximateNow() const { return Now(); }
+
+QuicTime QuicDefaultClock::Now() const {
+ return CreateTimeFromMicroseconds(absl::GetCurrentTimeNanos() / 1000);
+}
+
+QuicWallTime QuicDefaultClock::WallNow() const {
+ return QuicWallTime::FromUNIXMicroseconds(absl::GetCurrentTimeNanos() / 1000);
+}
+
+QuicTime QuicDefaultClock::ConvertWallTimeToQuicTime(
+ const QuicWallTime& walltime) const {
+ return CreateTimeFromMicroseconds(walltime.ToUNIXMicroseconds());
+}
+
+} // namespace quic
diff --git a/quiche/quic/core/quic_default_clock.h b/quiche/quic/core/quic_default_clock.h
new file mode 100644
index 0000000..96fec75
--- /dev/null
+++ b/quiche/quic/core/quic_default_clock.h
@@ -0,0 +1,34 @@
+// Copyright 2022 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_DEFAULT_CLOCK_H_
+#define QUICHE_QUIC_CORE_QUIC_DEFAULT_CLOCK_H_
+
+#include "quiche/quic/core/quic_clock.h"
+#include "quiche/quic/core/quic_time.h"
+#include "quiche/quic/platform/api/quic_export.h"
+
+namespace quic {
+
+// A QuicClock based on Abseil time API. Thread-safe.
+class QUIC_EXPORT_PRIVATE QuicDefaultClock : public QuicClock {
+ public:
+ // Provides a single default stateless instance of QuicDefaultClock.
+ static QuicDefaultClock* Get();
+
+ explicit QuicDefaultClock() = default;
+ QuicDefaultClock(const QuicDefaultClock&) = delete;
+ QuicDefaultClock& operator=(const QuicDefaultClock&) = delete;
+
+ // QuicClock implementation.
+ QuicTime ApproximateNow() const override;
+ QuicTime Now() const override;
+ QuicWallTime WallNow() const override;
+ QuicTime ConvertWallTimeToQuicTime(
+ const QuicWallTime& walltime) const override;
+};
+
+} // namespace quic
+
+#endif // QUICHE_QUIC_CORE_QUIC_DEFAULT_CLOCK_H_
diff --git a/quiche/quic/core/quic_default_connection_helper.h b/quiche/quic/core/quic_default_connection_helper.h
new file mode 100644
index 0000000..3a10b43
--- /dev/null
+++ b/quiche/quic/core/quic_default_connection_helper.h
@@ -0,0 +1,49 @@
+// Copyright 2022 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_DEFAULT_CONNECTION_HELPER_H_
+#define QUICHE_QUIC_CORE_QUIC_DEFAULT_CONNECTION_HELPER_H_
+
+#include "quiche/quic/core/crypto/quic_random.h"
+#include "quiche/quic/core/quic_connection.h"
+#include "quiche/quic/core/quic_default_clock.h"
+#include "quiche/common/simple_buffer_allocator.h"
+
+namespace quic {
+
+// A default implementation of QuicConnectionHelperInterface. Thread-safe.
+class QUIC_EXPORT_PRIVATE QuicDefaultConnectionHelper
+ : public QuicConnectionHelperInterface {
+ public:
+ static QuicDefaultConnectionHelper* Get() {
+ static QuicDefaultConnectionHelper* helper =
+ new QuicDefaultConnectionHelper();
+ return helper;
+ }
+
+ // Creates a helper that uses the default allocator.
+ QuicDefaultConnectionHelper() : QuicDefaultConnectionHelper(nullptr) {}
+ // If |allocator| is nullptr, the default one is used.
+ QuicDefaultConnectionHelper(
+ std::unique_ptr<quiche::QuicheBufferAllocator> allocator)
+ : allocator_(std::move(allocator)) {}
+
+ QuicDefaultConnectionHelper(const QuicDefaultConnectionHelper&) = delete;
+ QuicDefaultConnectionHelper& operator=(const QuicDefaultConnectionHelper&) =
+ delete;
+
+ const QuicClock* GetClock() const override { return QuicDefaultClock::Get(); }
+ QuicRandom* GetRandomGenerator() override {
+ return QuicRandom::GetInstance();
+ }
+ quiche::QuicheBufferAllocator* GetStreamSendBufferAllocator() override {
+ return allocator_ ? allocator_.get() : quiche::SimpleBufferAllocator::Get();
+ }
+
+ private:
+ std::unique_ptr<quiche::QuicheBufferAllocator> allocator_;
+};
+} // namespace quic
+
+#endif // QUICHE_QUIC_CORE_QUIC_DEFAULT_CONNECTION_HELPER_H_