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_