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 053b445b0e9c2fce2abb4055600df5db3dfcb490..c84ab1109e9b7b9272b917263f6e8c9a46d86713 100644 |
--- a/net/quic/quic_unacked_packet_map.cc |
+++ b/net/quic/quic_unacked_packet_map.cc |
@@ -15,6 +15,7 @@ namespace net { |
QuicUnackedPacketMap::QuicUnackedPacketMap() |
: largest_sent_packet_(0), |
+ largest_observed_(0), |
bytes_in_flight_(0), |
pending_crypto_packet_count_(0) { |
} |
@@ -123,16 +124,15 @@ void QuicUnackedPacketMap::NackPacket(QuicPacketSequenceNumber sequence_number, |
} |
void QuicUnackedPacketMap::RemoveRetransmittability( |
- QuicPacketSequenceNumber sequence_number, |
- QuicPacketSequenceNumber largest_observed) { |
+ QuicPacketSequenceNumber sequence_number) { |
UnackedPacketMap::iterator it = unacked_packets_.find(sequence_number); |
if (it == unacked_packets_.end()) { |
- LOG(DFATAL) << "packet is not unacked: " << sequence_number; |
+ DVLOG(1) << "packet is not in unacked_packets: " << sequence_number; |
return; |
} |
SequenceNumberSet* all_transmissions = it->second.all_transmissions; |
// TODO(ianswett): Consider optimizing this for lone packets. |
- // TODO(ianswett): Consider adding a check to ensure there are retranmittable |
+ // TODO(ianswett): Consider adding a check to ensure there are retransmittable |
// frames associated with this packet. |
for (SequenceNumberSet::reverse_iterator it = all_transmissions->rbegin(); |
it != all_transmissions->rend(); ++it) { |
@@ -143,7 +143,7 @@ void QuicUnackedPacketMap::RemoveRetransmittability( |
continue; |
} |
MaybeRemoveRetransmittableFrames(transmission_info); |
- if (sequence_number <= largest_observed && !transmission_info->pending) { |
+ if (*it <= largest_observed_ && !transmission_info->pending) { |
unacked_packets_.erase(*it); |
} else { |
transmission_info->all_transmissions = new SequenceNumberSet(); |
@@ -166,27 +166,29 @@ void QuicUnackedPacketMap::MaybeRemoveRetransmittableFrames( |
} |
} |
-void QuicUnackedPacketMap::RemoveRttOnlyPacket( |
- 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; |
+void QuicUnackedPacketMap::IncreaseLargestObserved( |
+ QuicPacketSequenceNumber largest_observed) { |
+ DCHECK_LT(largest_observed_, largest_observed); |
+ largest_observed_ = largest_observed; |
+ UnackedPacketMap::iterator it = unacked_packets_.begin(); |
+ while (it != unacked_packets_.end() && it->first <= largest_observed_) { |
+ if (!IsPacketUseless(it)) { |
+ ++it; |
+ continue; |
+ } |
+ delete it->second.all_transmissions; |
+ QuicPacketSequenceNumber sequence_number = it->first; |
+ ++it; |
+ unacked_packets_.erase(sequence_number); |
} |
- TransmissionInfo* transmission_info = &it->second; |
- DCHECK(!transmission_info->pending); |
- DCHECK(transmission_info->retransmittable_frames == NULL); |
- DCHECK_EQ(1u, transmission_info->all_transmissions->size()); |
- delete transmission_info->all_transmissions; |
- unacked_packets_.erase(it); |
} |
-// static |
-bool QuicUnackedPacketMap::IsForRttOnly( |
- const TransmissionInfo& transmission_info) { |
- return !transmission_info.pending && |
- transmission_info.retransmittable_frames == NULL && |
- transmission_info.all_transmissions->size() == 1; |
+bool QuicUnackedPacketMap::IsPacketUseless( |
+ UnackedPacketMap::const_iterator it) { |
+ return it->first <= largest_observed_ && |
+ !it->second.pending && |
+ it->second.retransmittable_frames == NULL && |
+ it->second.all_transmissions->size() == 1; |
} |
bool QuicUnackedPacketMap::IsUnacked( |
@@ -207,6 +209,10 @@ void QuicUnackedPacketMap::SetNotPending( |
bytes_in_flight_ -= it->second.bytes_sent; |
it->second.pending = false; |
} |
+ if (IsPacketUseless(it)) { |
+ delete it->second.all_transmissions; |
+ unacked_packets_.erase(it); |
+ } |
} |
bool QuicUnackedPacketMap::HasUnackedPackets() const { |