Replace uses of std::function with quiche::UnretainedCallback where appropriate UnretainedCallback is not nullable, unlike std::function, so in one of the places it gets replaced with an absl::optional<UnretainedCallback>. PiperOrigin-RevId: 536781656
diff --git a/quiche/balsa/balsa_headers.cc b/quiche/balsa/balsa_headers.cc index 80642c3..e6ee93c 100644 --- a/quiche/balsa/balsa_headers.cc +++ b/quiche/balsa/balsa_headers.cc
@@ -873,8 +873,8 @@ } bool BalsaHeaders::ForEachHeader( - std::function<bool(const absl::string_view key, - const absl::string_view value)> + quiche::UnretainedCallback<bool(const absl::string_view key, + const absl::string_view value)> fn) const { int s = header_lines_.size(); for (int i = 0; i < s; ++i) { @@ -980,7 +980,7 @@ void BalsaHeaders::RemoveAuthority() { RemoveAllOfHeader(kHost); } void BalsaHeaders::ApplyToCookie( - std::function<void(absl::string_view cookie)> f) const { + quiche::UnretainedCallback<void(absl::string_view cookie)> f) const { f(GetHeader(kCookie)); }
diff --git a/quiche/balsa/balsa_headers.h b/quiche/balsa/balsa_headers.h index 0005bb5..d0a4b6f 100644 --- a/quiche/balsa/balsa_headers.h +++ b/quiche/balsa/balsa_headers.h
@@ -30,6 +30,7 @@ #include "quiche/common/platform/api/quiche_bug_tracker.h" #include "quiche/common/platform/api/quiche_export.h" #include "quiche/common/platform/api/quiche_logging.h" +#include "quiche/common/quiche_callbacks.h" namespace gfe2 { class Http2HeaderValidator; @@ -834,9 +835,10 @@ void DumpToString(std::string* str) const; std::string DebugString() const override; - bool ForEachHeader(std::function<bool(const absl::string_view key, - const absl::string_view value)> - fn) const override; + bool ForEachHeader( + quiche::UnretainedCallback<bool(const absl::string_view key, + const absl::string_view value)> + fn) const override; void DumpToPrefixedString(const char* spaces, std::string* str) const; @@ -1007,8 +1009,8 @@ absl::string_view Authority() const override; void ReplaceOrAppendAuthority(absl::string_view value) override; void RemoveAuthority() override; - void ApplyToCookie( - std::function<void(absl::string_view cookie)> f) const override; + void ApplyToCookie(quiche::UnretainedCallback<void(absl::string_view cookie)> + f) const override; void set_enforce_header_policy(bool enforce) override { enforce_header_policy_ = enforce;
diff --git a/quiche/balsa/header_api.h b/quiche/balsa/header_api.h index 889c984..e607172 100644 --- a/quiche/balsa/header_api.h +++ b/quiche/balsa/header_api.h
@@ -13,6 +13,7 @@ #include "absl/strings/string_view.h" #include "quiche/common/platform/api/quiche_export.h" #include "quiche/common/platform/api/quiche_lower_case_string.h" +#include "quiche/common/quiche_callbacks.h" namespace quiche { @@ -116,9 +117,10 @@ // Applies the argument function to each header line. If the argument // function returns false, iteration stops and ForEachHeader returns false; // otherwise, ForEachHeader returns true. - virtual bool ForEachHeader(std::function<bool(const absl::string_view key, - const absl::string_view value)> - fn) const = 0; + virtual bool ForEachHeader( + quiche::UnretainedCallback<bool(const absl::string_view key, + const absl::string_view value)> + fn) const = 0; // Returns the upper bound byte size of the headers. This can be used to size // a Buffer when serializing headers. @@ -167,7 +169,7 @@ // cookie.data() will be nullptr. The lifetime of the cookie isn't guaranteed // to extend beyond this call. virtual void ApplyToCookie( - std::function<void(absl::string_view cookie)> f) const = 0; + quiche::UnretainedCallback<void(absl::string_view cookie)> f) const = 0; virtual size_t content_length() const = 0; virtual bool content_length_valid() const = 0;
diff --git a/quiche/quic/core/quic_dispatcher.cc b/quiche/quic/core/quic_dispatcher.cc index d92ffff..70e4e6b 100644 --- a/quiche/quic/core/quic_dispatcher.cc +++ b/quiche/quic/core/quic_dispatcher.cc
@@ -27,6 +27,7 @@ #include "quiche/quic/platform/api/quic_logging.h" #include "quiche/quic/platform/api/quic_socket_address.h" #include "quiche/quic/platform/api/quic_stack_trace.h" +#include "quiche/common/quiche_callbacks.h" #include "quiche/common/quiche_text_utils.h" namespace quic { @@ -791,7 +792,7 @@ } void QuicDispatcher::PerformActionOnActiveSessions( - std::function<void(QuicSession*)> operation) const { + quiche::UnretainedCallback<void(QuicSession*)> operation) const { absl::flat_hash_set<QuicSession*> visited_session; visited_session.reserve(reference_counted_session_map_.size()); for (auto const& kv : reference_counted_session_map_) {
diff --git a/quiche/quic/core/quic_dispatcher.h b/quiche/quic/core/quic_dispatcher.h index 24602b3..82a8618 100644 --- a/quiche/quic/core/quic_dispatcher.h +++ b/quiche/quic/core/quic_dispatcher.h
@@ -30,6 +30,7 @@ #include "quiche/quic/core/quic_version_manager.h" #include "quiche/quic/platform/api/quic_socket_address.h" #include "quiche/common/platform/api/quiche_reference_counted.h" +#include "quiche/common/quiche_callbacks.h" #include "quiche/common/quiche_linked_hash_map.h" namespace quic { @@ -163,7 +164,7 @@ // Apply an operation for each session. void PerformActionOnActiveSessions( - std::function<void(QuicSession*)> operation) const; + quiche::UnretainedCallback<void(QuicSession*)> operation) const; // Get a snapshot of all sessions. std::vector<std::shared_ptr<QuicSession>> GetSessionsSnapshot() const;
diff --git a/quiche/quic/core/quic_linux_socket_utils.h b/quiche/quic/core/quic_linux_socket_utils.h index 8d53e47..41be945 100644 --- a/quiche/quic/core/quic_linux_socket_utils.h +++ b/quiche/quic/core/quic_linux_socket_utils.h
@@ -24,6 +24,7 @@ #include "quiche/quic/platform/api/quic_ip_address.h" #include "quiche/quic/platform/api/quic_logging.h" #include "quiche/quic/platform/api/quic_socket_address.h" +#include "quiche/common/quiche_callbacks.h" #ifndef SOL_UDP #define SOL_UDP 17 @@ -156,11 +157,13 @@ // QuicSocketUtils::WriteMultiplePackets(fd, &mhdr, &num_packets_sent); class QUIC_EXPORT_PRIVATE QuicMMsgHdr { public: - using ControlBufferInitializer = std::function<void( + using ControlBufferInitializer = quiche::UnretainedCallback<void( QuicMMsgHdr* mhdr, int i, const BufferedWrite& buffered_write)>; template <typename IteratorT> - QuicMMsgHdr(const IteratorT& first, const IteratorT& last, size_t cbuf_size, - ControlBufferInitializer cbuf_initializer) + QuicMMsgHdr( + const IteratorT& first, const IteratorT& last, size_t cbuf_size, + ControlBufferInitializer cbuf_initializer = + +[](quic::QuicMMsgHdr*, int, const quic::BufferedWrite&) {}) : num_msgs_(std::distance(first, last)), cbuf_size_(cbuf_size) { static_assert( std::is_same<typename std::iterator_traits<IteratorT>::value_type, @@ -180,9 +183,7 @@ ++i; InitOneHeader(i, *it); - if (cbuf_initializer) { - cbuf_initializer(this, i, *it); - } + cbuf_initializer(this, i, *it); } }
diff --git a/quiche/quic/core/quic_linux_socket_utils_test.cc b/quiche/quic/core/quic_linux_socket_utils_test.cc index e9d1b14..9c45662 100644 --- a/quiche/quic/core/quic_linux_socket_utils_test.cc +++ b/quiche/quic/core/quic_linux_socket_utils_test.cc
@@ -178,7 +178,7 @@ QuicSocketAddress(QuicIpAddress::Loopback6(), 6)); QuicMMsgHdr quic_mhdr_without_cbuf(buffered_writes.begin(), - buffered_writes.end(), 0, nullptr); + buffered_writes.end(), 0); for (size_t i = 0; i < buffered_writes.size(); ++i) { const BufferedWrite& bw = buffered_writes[i]; CheckMsghdrWithoutCbuf(&quic_mhdr_without_cbuf.mhdr()[i].msg_hdr, bw.buffer,
diff --git a/quiche/quic/core/quic_session.cc b/quiche/quic/core/quic_session.cc index 39fef52..74a0fc0 100644 --- a/quiche/quic/core/quic_session.cc +++ b/quiche/quic/core/quic_session.cc
@@ -29,6 +29,7 @@ #include "quiche/quic/platform/api/quic_server_stats.h" #include "quiche/quic/platform/api/quic_stack_trace.h" #include "quiche/common/platform/api/quiche_logging.h" +#include "quiche/common/quiche_callbacks.h" #include "quiche/common/quiche_text_utils.h" namespace quic { @@ -2641,7 +2642,7 @@ } void QuicSession::PerformActionOnActiveStreams( - std::function<bool(QuicStream*)> action) { + quiche::UnretainedCallback<bool(QuicStream*)> action) { std::vector<QuicStream*> active_streams; for (const auto& it : stream_map_) { if (!it.second->is_static() && !it.second->IsZombie()) { @@ -2657,7 +2658,7 @@ } void QuicSession::PerformActionOnActiveStreams( - std::function<bool(QuicStream*)> action) const { + quiche::UnretainedCallback<bool(QuicStream*)> action) const { for (const auto& it : stream_map_) { if (!it.second->is_static() && !it.second->IsZombie() && !action(it.second.get())) {
diff --git a/quiche/quic/core/quic_session.h b/quiche/quic/core/quic_session.h index d503b01..fe7e4bb 100644 --- a/quiche/quic/core/quic_session.h +++ b/quiche/quic/core/quic_session.h
@@ -45,6 +45,7 @@ #include "quiche/quic/platform/api/quic_flags.h" #include "quiche/quic/platform/api/quic_socket_address.h" #include "quiche/common/platform/api/quiche_mem_slice.h" +#include "quiche/common/quiche_callbacks.h" #include "quiche/common/quiche_linked_hash_map.h" namespace quic { @@ -804,9 +805,10 @@ // Called by applications to perform |action| on active streams. // Stream iteration will be stopped if action returns false. - void PerformActionOnActiveStreams(std::function<bool(QuicStream*)> action); void PerformActionOnActiveStreams( - std::function<bool(QuicStream*)> action) const; + quiche::UnretainedCallback<bool(QuicStream*)> action); + void PerformActionOnActiveStreams( + quiche::UnretainedCallback<bool(QuicStream*)> action) const; // Return the largest peer created stream id depending on directionality // indicated by |unidirectional|.
diff --git a/quiche/quic/qbone/platform/icmp_packet.cc b/quiche/quic/qbone/platform/icmp_packet.cc index 3f15bb7..79df687 100644 --- a/quiche/quic/qbone/platform/icmp_packet.cc +++ b/quiche/quic/qbone/platform/icmp_packet.cc
@@ -8,6 +8,7 @@ #include "absl/strings/string_view.h" #include "quiche/quic/qbone/platform/internet_checksum.h" +#include "quiche/common/quiche_callbacks.h" #include "quiche/common/quiche_endian.h" namespace quic { @@ -41,7 +42,7 @@ void CreateIcmpPacket(in6_addr src, in6_addr dst, const icmp6_hdr& icmp_header, absl::string_view body, - const std::function<void(absl::string_view)>& cb) { + quiche::UnretainedCallback<void(absl::string_view)> cb) { const size_t body_size = std::min(body.size(), kICMPv6BodyMaxSize); const size_t payload_size = kICMPv6HeaderSize + body_size;
diff --git a/quiche/quic/qbone/platform/icmp_packet.h b/quiche/quic/qbone/platform/icmp_packet.h index c83513c..82608a7 100644 --- a/quiche/quic/qbone/platform/icmp_packet.h +++ b/quiche/quic/qbone/platform/icmp_packet.h
@@ -12,6 +12,7 @@ #include "absl/strings/string_view.h" #include "quiche/quic/platform/api/quic_ip_address.h" +#include "quiche/common/quiche_callbacks.h" namespace quic { @@ -20,7 +21,7 @@ // stack allocated inside CreateIcmpPacket. void CreateIcmpPacket(in6_addr src, in6_addr dst, const icmp6_hdr& icmp_header, absl::string_view body, - const std::function<void(absl::string_view)>& cb); + quiche::UnretainedCallback<void(absl::string_view)> cb); } // namespace quic
diff --git a/quiche/quic/qbone/platform/tcp_packet.cc b/quiche/quic/qbone/platform/tcp_packet.cc index e73e284..9c2f409 100644 --- a/quiche/quic/qbone/platform/tcp_packet.cc +++ b/quiche/quic/qbone/platform/tcp_packet.cc
@@ -10,6 +10,7 @@ #include "absl/strings/string_view.h" #include "quiche/quic/platform/api/quic_logging.h" #include "quiche/quic/qbone/platform/internet_checksum.h" +#include "quiche/common/quiche_callbacks.h" #include "quiche/common/quiche_endian.h" namespace quic { @@ -31,8 +32,9 @@ } // namespace -void CreateTcpResetPacket(absl::string_view original_packet, - const std::function<void(absl::string_view)>& cb) { +void CreateTcpResetPacket( + absl::string_view original_packet, + quiche::UnretainedCallback<void(absl::string_view)> cb) { // By the time this method is called, original_packet should be fairly // strongly validated. However, it's better to be more paranoid than not, so // here are a bunch of very obvious checks.
diff --git a/quiche/quic/qbone/platform/tcp_packet.h b/quiche/quic/qbone/platform/tcp_packet.h index 7e9550f..bb4acd0 100644 --- a/quiche/quic/qbone/platform/tcp_packet.h +++ b/quiche/quic/qbone/platform/tcp_packet.h
@@ -12,13 +12,15 @@ #include "absl/strings/string_view.h" #include "quiche/quic/platform/api/quic_ip_address.h" +#include "quiche/common/quiche_callbacks.h" namespace quic { // Creates an TCPv6 RST packet, returning a packed string representation of the // packet to |cb|. -void CreateTcpResetPacket(absl::string_view original_packet, - const std::function<void(absl::string_view)>& cb); +void CreateTcpResetPacket( + absl::string_view original_packet, + quiche::UnretainedCallback<void(absl::string_view)> cb); } // namespace quic
diff --git a/quiche/quic/test_tools/crypto_test_utils.cc b/quiche/quic/test_tools/crypto_test_utils.cc index 4df4f8f..f7cf1cf 100644 --- a/quiche/quic/test_tools/crypto_test_utils.cc +++ b/quiche/quic/test_tools/crypto_test_utils.cc
@@ -47,6 +47,7 @@ #include "quiche/quic/test_tools/quic_test_utils.h" #include "quiche/quic/test_tools/simple_quic_framer.h" #include "quiche/quic/test_tools/test_certificates.h" +#include "quiche/common/quiche_callbacks.h" #include "quiche/common/test_tools/quiche_test_utils.h" namespace quic { @@ -399,13 +400,12 @@ } } -bool CommunicateHandshakeMessagesUntil(PacketSavingConnection* client_conn, - QuicCryptoStream* client, - std::function<bool()> client_condition, - PacketSavingConnection* server_conn, - QuicCryptoStream* server, - std::function<bool()> server_condition, - bool process_stream_data) { +bool CommunicateHandshakeMessagesUntil( + PacketSavingConnection* client_conn, QuicCryptoStream* client, + quiche::UnretainedCallback<bool()> client_condition, + PacketSavingConnection* server_conn, QuicCryptoStream* server, + quiche::UnretainedCallback<bool()> server_condition, + bool process_stream_data) { size_t client_next_packet_to_deliver = client_conn->number_of_packets_delivered_; size_t server_next_packet_to_deliver =
diff --git a/quiche/quic/test_tools/crypto_test_utils.h b/quiche/quic/test_tools/crypto_test_utils.h index d650706..42738e4 100644 --- a/quiche/quic/test_tools/crypto_test_utils.h +++ b/quiche/quic/test_tools/crypto_test_utils.h
@@ -18,6 +18,7 @@ #include "quiche/quic/core/quic_framer.h" #include "quiche/quic/core/quic_packets.h" #include "quiche/quic/test_tools/quic_test_utils.h" +#include "quiche/common/quiche_callbacks.h" namespace quic { @@ -114,13 +115,12 @@ // 4) Returns true if both conditions are met. // 5) Returns false if either connection is closed or there is no more packet to // deliver before both conditions are met. -bool CommunicateHandshakeMessagesUntil(PacketSavingConnection* client_conn, - QuicCryptoStream* client, - std::function<bool()> client_condition, - PacketSavingConnection* server_conn, - QuicCryptoStream* server, - std::function<bool()> server_condition, - bool process_stream_data); +bool CommunicateHandshakeMessagesUntil( + PacketSavingConnection* client_conn, QuicCryptoStream* client, + quiche::UnretainedCallback<bool()> client_condition, + PacketSavingConnection* server_conn, QuicCryptoStream* server, + quiche::UnretainedCallback<bool()> server_condition, + bool process_stream_data); // AdvanceHandshake attempts to moves messages from |client| to |server| and // |server| to |client|. Returns the number of messages moved.
diff --git a/quiche/quic/test_tools/quic_test_client.cc b/quiche/quic/test_tools/quic_test_client.cc index 5835800..223ef87 100644 --- a/quiche/quic/test_tools/quic_test_client.cc +++ b/quiche/quic/test_tools/quic_test_client.cc
@@ -29,6 +29,7 @@ #include "quiche/quic/test_tools/quic_spdy_stream_peer.h" #include "quiche/quic/test_tools/quic_test_utils.h" #include "quiche/quic/tools/quic_url.h" +#include "quiche/common/quiche_callbacks.h" #include "quiche/common/quiche_text_utils.h" namespace quic { @@ -627,17 +628,19 @@ return push_promise_data_to_resend_.get() || !open_streams_.empty(); } -bool QuicTestClient::WaitUntil(int timeout_ms, std::function<bool()> trigger) { +bool QuicTestClient::WaitUntil( + int timeout_ms, + absl::optional<quiche::UnretainedCallback<bool()>> trigger) { QuicTime::Delta timeout = QuicTime::Delta::FromMilliseconds(timeout_ms); const QuicClock* clock = client()->session()->connection()->clock(); QuicTime end_waiting_time = clock->Now() + timeout; - while (connected() && !(trigger && trigger()) && + while (connected() && !(trigger.has_value() && (*trigger)()) && (timeout_ms < 0 || clock->Now() < end_waiting_time)) { event_loop_->RunEventLoopOnce(timeout); client_->WaitForEventsPostprocessing(); } ReadNextResponse(); - if (trigger && !trigger()) { + if (trigger.has_value() && !(*trigger)()) { QUIC_VLOG(1) << "Client WaitUntil returning with trigger returning false."; return false; } @@ -839,8 +842,7 @@ QuicTestClient::PerStreamState::PerStreamState( QuicRstStreamErrorCode stream_error, bool response_complete, bool response_headers_complete, - const spdy::Http2HeaderBlock& response_headers, - const std::string& response, + const spdy::Http2HeaderBlock& response_headers, const std::string& response, const spdy::Http2HeaderBlock& response_trailers, uint64_t bytes_read, uint64_t bytes_written, int64_t response_body_size) : stream_error(stream_error),
diff --git a/quiche/quic/test_tools/quic_test_client.h b/quiche/quic/test_tools/quic_test_client.h index 4b95046..8d5ba85 100644 --- a/quiche/quic/test_tools/quic_test_client.h +++ b/quiche/quic/test_tools/quic_test_client.h
@@ -17,6 +17,7 @@ #include "quiche/quic/core/quic_packets.h" #include "quiche/quic/platform/api/quic_test.h" #include "quiche/quic/tools/quic_default_client.h" +#include "quiche/common/quiche_callbacks.h" #include "quiche/common/quiche_linked_hash_map.h" #include "quiche/spdy/core/http2_header_block.h" @@ -160,7 +161,8 @@ void Disconnect(); QuicSocketAddress local_address() const; void ClearPerRequestState(); - bool WaitUntil(int timeout_ms, std::function<bool()> trigger); + bool WaitUntil(int timeout_ms, + absl::optional<quiche::UnretainedCallback<bool()>> trigger); int64_t Send(absl::string_view data); bool connected() const; bool buffer_body() const;