Index: net/quic/quic_unacked_packet_map.cc |
diff --git a/net/quic/quic_unacked_packet_map.cc b/net/quic/quic_unacked_packet_map.cc |
index 875c5654cae95b4d29c6500b6f74c8baf4a2e5a0..cb21f6104f1ef99ed1879558b758965582bb107f 100644 |
--- a/net/quic/quic_unacked_packet_map.cc |
+++ b/net/quic/quic_unacked_packet_map.cc |
@@ -91,7 +91,7 @@ void QuicUnackedPacketMap::ClearPreviousRetransmissions(size_t num_to_clear) { |
} |
++it; |
- NeuterIfPendingOrRemovePacket(sequence_number); |
+ RemovePacket(sequence_number); |
--num_to_clear; |
} |
} |
@@ -119,7 +119,30 @@ void QuicUnackedPacketMap::NackPacket(QuicPacketSequenceNumber sequence_number, |
it->second.nack_count = max(min_nacks, it->second.nack_count); |
} |
-void QuicUnackedPacketMap::NeuterIfPendingOrRemovePacket( |
+void QuicUnackedPacketMap::RemovePacket( |
+ QuicPacketSequenceNumber sequence_number) { |
+ UnackedPacketMap::iterator it = unacked_packets_.find(sequence_number); |
+ if (it == unacked_packets_.end()) { |
+ LOG(DFATAL) << "packet is not unacked: " << sequence_number; |
+ return; |
+ } |
+ const TransmissionInfo& transmission_info = it->second; |
+ transmission_info.all_transmissions->erase(sequence_number); |
+ if (transmission_info.all_transmissions->empty()) { |
+ delete transmission_info.all_transmissions; |
+ } |
+ if (transmission_info.retransmittable_frames != NULL) { |
+ if (transmission_info.retransmittable_frames->HasCryptoHandshake() |
+ == IS_HANDSHAKE) { |
+ --pending_crypto_packet_count_; |
+ } |
+ delete transmission_info.retransmittable_frames; |
+ } |
+ DCHECK(!transmission_info.pending); |
+ unacked_packets_.erase(it); |
+} |
+ |
+void QuicUnackedPacketMap::NeuterPacket( |
QuicPacketSequenceNumber sequence_number) { |
UnackedPacketMap::iterator it = unacked_packets_.find(sequence_number); |
if (it == unacked_packets_.end()) { |
@@ -127,6 +150,11 @@ void QuicUnackedPacketMap::NeuterIfPendingOrRemovePacket( |
return; |
} |
TransmissionInfo* transmission_info = &it->second; |
+ if (transmission_info->all_transmissions->size() > 1) { |
+ transmission_info->all_transmissions->erase(sequence_number); |
+ transmission_info->all_transmissions = new SequenceNumberSet(); |
+ transmission_info->all_transmissions->insert(sequence_number); |
+ } |
if (transmission_info->retransmittable_frames != NULL) { |
if (transmission_info->retransmittable_frames->HasCryptoHandshake() |
== IS_HANDSHAKE) { |
@@ -135,21 +163,6 @@ void QuicUnackedPacketMap::NeuterIfPendingOrRemovePacket( |
delete transmission_info->retransmittable_frames; |
transmission_info->retransmittable_frames = NULL; |
} |
- if (transmission_info->pending) { |
- // Neuter it so it can't be retransmitted. |
- if (transmission_info->all_transmissions->size() > 1) { |
- transmission_info->all_transmissions->erase(sequence_number); |
- transmission_info->all_transmissions = new SequenceNumberSet(); |
- transmission_info->all_transmissions->insert(sequence_number); |
- } |
- } else { |
- // Remove it. |
- transmission_info->all_transmissions->erase(sequence_number); |
- if (transmission_info->all_transmissions->empty()) { |
- delete transmission_info->all_transmissions; |
- } |
- unacked_packets_.erase(it); |
- } |
} |
// static |