| Index: net/quic/quic_packet_generator.cc
|
| diff --git a/net/quic/quic_packet_generator.cc b/net/quic/quic_packet_generator.cc
|
| index bfecf5dae1823b07e3f6e071dc9fbdf9974b4be2..3b5cc7001e924003cf6b0357a0a7e3c7a9f8b782 100644
|
| --- a/net/quic/quic_packet_generator.cc
|
| +++ b/net/quic/quic_packet_generator.cc
|
| @@ -46,7 +46,9 @@ QuicPacketGenerator::QuicPacketGenerator(QuicConnectionId connection_id,
|
| fec_timeout_(QuicTime::Delta::Zero()),
|
| should_fec_protect_(false),
|
| should_send_ack_(false),
|
| - should_send_stop_waiting_(false) {
|
| + should_send_stop_waiting_(false),
|
| + ack_queued_(false),
|
| + stop_waiting_queued_(false) {
|
| }
|
|
|
| QuicPacketGenerator::~QuicPacketGenerator() {
|
| @@ -101,12 +103,12 @@ void QuicPacketGenerator::OnRttChange(QuicTime::Delta rtt) {
|
| }
|
|
|
| void QuicPacketGenerator::SetShouldSendAck(bool also_send_stop_waiting) {
|
| - if (pending_ack_frame_ != nullptr) {
|
| + if (ack_queued_) {
|
| // Ack already queued, nothing to do.
|
| return;
|
| }
|
|
|
| - if (also_send_stop_waiting && pending_stop_waiting_frame_ != nullptr) {
|
| + if (also_send_stop_waiting && stop_waiting_queued_) {
|
| LOG(DFATAL) << "Should only ever be one pending stop waiting frame.";
|
| return;
|
| }
|
| @@ -360,19 +362,21 @@ bool QuicPacketGenerator::HasPendingFrames() const {
|
|
|
| bool QuicPacketGenerator::AddNextPendingFrame() {
|
| if (should_send_ack_) {
|
| - pending_ack_frame_.reset(delegate_->CreateAckFrame());
|
| + delegate_->PopulateAckFrame(&pending_ack_frame_);
|
| + ack_queued_ = true;
|
| // If we can't this add the frame now, then we still need to do so later.
|
| - should_send_ack_ = !AddFrame(QuicFrame(pending_ack_frame_.get()));
|
| + should_send_ack_ = !AddFrame(QuicFrame(&pending_ack_frame_));
|
| // Return success if we have cleared out this flag (i.e., added the frame).
|
| // If we still need to send, then the frame is full, and we have failed.
|
| return !should_send_ack_;
|
| }
|
|
|
| if (should_send_stop_waiting_) {
|
| - pending_stop_waiting_frame_.reset(delegate_->CreateStopWaitingFrame());
|
| + delegate_->PopulateStopWaitingFrame(&pending_stop_waiting_frame_);
|
| + stop_waiting_queued_ = true;
|
| // If we can't this add the frame now, then we still need to do so later.
|
| should_send_stop_waiting_ =
|
| - !AddFrame(QuicFrame(pending_stop_waiting_frame_.get()));
|
| + !AddFrame(QuicFrame(&pending_stop_waiting_frame_));
|
| // Return success if we have cleared out this flag (i.e., added the frame).
|
| // If we still need to send, then the frame is full, and we have failed.
|
| return !should_send_stop_waiting_;
|
| @@ -409,9 +413,9 @@ void QuicPacketGenerator::SerializeAndSendPacket() {
|
| delegate_->OnSerializedPacket(serialized_packet);
|
| MaybeSendFecPacketAndCloseGroup(/*force=*/false);
|
|
|
| - // The packet has now been serialized, safe to delete pending frames.
|
| - pending_ack_frame_.reset();
|
| - pending_stop_waiting_frame_.reset();
|
| + // The packet has now been serialized, so the frames are no longer queued.
|
| + ack_queued_ = false;
|
| + stop_waiting_queued_ = false;
|
| }
|
|
|
| void QuicPacketGenerator::StopSendingVersion() {
|
| @@ -436,7 +440,7 @@ QuicEncryptedPacket* QuicPacketGenerator::SerializeVersionNegotiationPacket(
|
| }
|
|
|
| SerializedPacket QuicPacketGenerator::ReserializeAllFrames(
|
| - const QuicFrames& frames,
|
| + const RetransmittableFrames& frames,
|
| QuicSequenceNumberLength original_length) {
|
| return packet_creator_.ReserializeAllFrames(frames, original_length);
|
| }
|
|
|