Switch QuicheMemSlice to a platform-independent implementation. Protected by FLAGS_quic_restart_flag_quiche_use_default_memslice. PiperOrigin-RevId: 703577230
diff --git a/build/source_list.bzl b/build/source_list.bzl index 5181580..2294c69 100644 --- a/build/source_list.bzl +++ b/build/source_list.bzl
@@ -43,6 +43,7 @@ "common/quiche_crypto_logging.h", "common/quiche_data_reader.h", "common/quiche_data_writer.h", + "common/quiche_default_mem_slice_impl.h", "common/quiche_endian.h", "common/quiche_feature_flags_list.h", "common/quiche_intrusive_list.h",
diff --git a/build/source_list.gni b/build/source_list.gni index 66e3094..87e9862 100644 --- a/build/source_list.gni +++ b/build/source_list.gni
@@ -43,6 +43,7 @@ "src/quiche/common/quiche_crypto_logging.h", "src/quiche/common/quiche_data_reader.h", "src/quiche/common/quiche_data_writer.h", + "src/quiche/common/quiche_default_mem_slice_impl.h", "src/quiche/common/quiche_endian.h", "src/quiche/common/quiche_feature_flags_list.h", "src/quiche/common/quiche_intrusive_list.h",
diff --git a/build/source_list.json b/build/source_list.json index 05e7585..3b28c42 100644 --- a/build/source_list.json +++ b/build/source_list.json
@@ -42,6 +42,7 @@ "quiche/common/quiche_crypto_logging.h", "quiche/common/quiche_data_reader.h", "quiche/common/quiche_data_writer.h", + "quiche/common/quiche_default_mem_slice_impl.h", "quiche/common/quiche_endian.h", "quiche/common/quiche_feature_flags_list.h", "quiche/common/quiche_intrusive_list.h",
diff --git a/quiche/common/platform/default/quiche_platform_impl/quiche_mem_slice_impl.h b/quiche/common/platform/default/quiche_platform_impl/quiche_mem_slice_impl.h index bf78b29..ed4c326 100644 --- a/quiche/common/platform/default/quiche_platform_impl/quiche_mem_slice_impl.h +++ b/quiche/common/platform/default/quiche_platform_impl/quiche_mem_slice_impl.h
@@ -1,86 +1,11 @@ #ifndef QUICHE_COMMON_PLATFORM_DEFAULT_QUICHE_PLATFORM_IMPL_QUICHE_MEM_SLICE_IMPL_H_ #define QUICHE_COMMON_PLATFORM_DEFAULT_QUICHE_PLATFORM_IMPL_QUICHE_MEM_SLICE_IMPL_H_ -#include <cstddef> -#include <cstdlib> -#include <memory> -#include <utility> - -#include "quiche/common/platform/api/quiche_export.h" -#include "quiche/common/quiche_buffer_allocator.h" -#include "quiche/common/quiche_callbacks.h" +#include "quiche/common/quiche_default_mem_slice_impl.h" namespace quiche { -class QUICHE_EXPORT QuicheMemSliceImpl { - public: - QuicheMemSliceImpl() = default; - - explicit QuicheMemSliceImpl(QuicheBuffer buffer) - : data_(buffer.data()), size_(buffer.size()) { - QuicheUniqueBufferPtr owned = buffer.Release(); - QuicheBufferAllocator* allocator = owned.get_deleter().allocator(); - owned.release(); - done_callback_ = [allocator](const char* ptr) { - allocator->Delete(const_cast<char*>(ptr)); - }; - } - - QuicheMemSliceImpl(std::unique_ptr<char[]> buffer, size_t length) - : data_(buffer.release()), - size_(length), - done_callback_(+[](const char* ptr) { delete[] ptr; }) {} - - QuicheMemSliceImpl(const char* buffer, size_t length, - SingleUseCallback<void(const char*)> done_callback) - : data_(buffer), - size_(length), - done_callback_(std::move(done_callback)) {} - - QuicheMemSliceImpl(const QuicheMemSliceImpl& other) = delete; - QuicheMemSliceImpl& operator=(const QuicheMemSliceImpl& other) = delete; - - // Move constructors. |other| will not hold a reference to the data buffer - // after this call completes. - QuicheMemSliceImpl(QuicheMemSliceImpl&& other) { - data_ = other.data_; - size_ = other.size_; - done_callback_ = std::move(other.done_callback_); - other.data_ = nullptr; - other.size_ = 0; - other.done_callback_ = nullptr; - } - QuicheMemSliceImpl& operator=(QuicheMemSliceImpl&& other) { - Reset(); - data_ = other.data_; - size_ = other.size_; - done_callback_ = std::move(other.done_callback_); - other.data_ = nullptr; - other.size_ = 0; - other.done_callback_ = nullptr; - return *this; - } - - ~QuicheMemSliceImpl() { Reset(); } - - void Reset() { - if (done_callback_ && data_ != nullptr) { - std::move(done_callback_)(data_); - } - data_ = nullptr; - size_ = 0; - done_callback_ = nullptr; - } - - const char* data() const { return data_; } - size_t length() const { return size_; } - bool empty() const { return size_ == 0; } - - private: - const char* data_ = nullptr; - size_t size_ = 0; - SingleUseCallback<void(const char*)> done_callback_ = nullptr; -}; +using QuicheMemSliceImpl = QuicheDefaultMemSliceImpl; } // namespace quiche
diff --git a/quiche/common/quiche_default_mem_slice_impl.h b/quiche/common/quiche_default_mem_slice_impl.h new file mode 100644 index 0000000..e2acde0 --- /dev/null +++ b/quiche/common/quiche_default_mem_slice_impl.h
@@ -0,0 +1,89 @@ +#ifndef QUICHE_COMMON_QUICHE_DEFAULT_MEM_SLICE_IMPL_H_ +#define QUICHE_COMMON_QUICHE_DEFAULT_MEM_SLICE_IMPL_H_ + +#include <cstddef> +#include <cstdlib> +#include <memory> +#include <utility> + +#include "quiche/common/platform/api/quiche_export.h" +#include "quiche/common/quiche_buffer_allocator.h" +#include "quiche/common/quiche_callbacks.h" + +namespace quiche { + +// The default (and soon, hopefully the only) implementation of QuicheMemSlice. +class QUICHE_EXPORT QuicheDefaultMemSliceImpl { + public: + QuicheDefaultMemSliceImpl() = default; + + explicit QuicheDefaultMemSliceImpl(QuicheBuffer buffer) + : data_(buffer.data()), size_(buffer.size()) { + QuicheUniqueBufferPtr owned = buffer.Release(); + QuicheBufferAllocator* allocator = owned.get_deleter().allocator(); + owned.release(); + done_callback_ = [allocator](const char* ptr) { + allocator->Delete(const_cast<char*>(ptr)); + }; + } + + QuicheDefaultMemSliceImpl(std::unique_ptr<char[]> buffer, size_t length) + : data_(buffer.release()), + size_(length), + done_callback_(+[](const char* ptr) { delete[] ptr; }) {} + + QuicheDefaultMemSliceImpl(const char* buffer, size_t length, + SingleUseCallback<void(const char*)> done_callback) + : data_(buffer), + size_(length), + done_callback_(std::move(done_callback)) {} + + QuicheDefaultMemSliceImpl(const QuicheDefaultMemSliceImpl& other) = delete; + QuicheDefaultMemSliceImpl& operator=(const QuicheDefaultMemSliceImpl& other) = + delete; + + // Move constructors. |other| will not hold a reference to the data buffer + // after this call completes. + QuicheDefaultMemSliceImpl(QuicheDefaultMemSliceImpl&& other) { + data_ = other.data_; + size_ = other.size_; + done_callback_ = std::move(other.done_callback_); + other.data_ = nullptr; + other.size_ = 0; + other.done_callback_ = nullptr; + } + QuicheDefaultMemSliceImpl& operator=(QuicheDefaultMemSliceImpl&& other) { + Reset(); + data_ = other.data_; + size_ = other.size_; + done_callback_ = std::move(other.done_callback_); + other.data_ = nullptr; + other.size_ = 0; + other.done_callback_ = nullptr; + return *this; + } + + ~QuicheDefaultMemSliceImpl() { Reset(); } + + void Reset() { + if (done_callback_ && data_ != nullptr) { + std::move(done_callback_)(data_); + } + data_ = nullptr; + size_ = 0; + done_callback_ = nullptr; + } + + const char* data() const { return data_; } + size_t length() const { return size_; } + bool empty() const { return size_ == 0; } + + private: + const char* data_ = nullptr; + size_t size_ = 0; + SingleUseCallback<void(const char*)> done_callback_ = nullptr; +}; + +} // namespace quiche + +#endif // QUICHE_COMMON_QUICHE_DEFAULT_MEM_SLICE_IMPL_H_