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 330e74aac7b416ab5fc4b7b0e06e84c1c9619057..0640c29940c1a5d0d5415c39575b1fb450fd70a1 100644 |
--- a/net/quic/quic_unacked_packet_map.cc |
+++ b/net/quic/quic_unacked_packet_map.cc |
@@ -27,7 +27,8 @@ QuicUnackedPacketMap::~QuicUnackedPacketMap() { |
it != unacked_packets_.end(); ++it, ++index) { |
delete it->retransmittable_frames; |
// Only delete all_transmissions once, for the newest packet. |
- if (index == *it->all_transmissions->rbegin()) { |
+ if (it->all_transmissions != NULL && |
+ index == *it->all_transmissions->rbegin()) { |
delete it->all_transmissions; |
} |
} |
@@ -41,7 +42,6 @@ void QuicUnackedPacketMap::AddPacket( |
serialized_packet.sequence_number); |
unacked_packets_.push_back( |
TransmissionInfo(serialized_packet.retransmittable_frames, |
- serialized_packet.sequence_number, |
serialized_packet.sequence_number_length)); |
if (serialized_packet.retransmittable_frames != NULL && |
serialized_packet.retransmittable_frames->HasCryptoHandshake() |
@@ -82,7 +82,7 @@ void QuicUnackedPacketMap::OnRetransmittedPacket( |
transmission_info->retransmittable_frames = NULL; |
// Only keep one transmission older than largest observed, because only the |
// most recent is expected to possibly be a spurious retransmission. |
- if (transmission_info->all_transmissions->size() > 1 && |
+ if (transmission_info->all_transmissions != NULL && |
*(++transmission_info->all_transmissions->begin()) < largest_observed_) { |
QuicPacketSequenceNumber old_transmission = |
*transmission_info->all_transmissions->begin(); |
@@ -90,15 +90,18 @@ void QuicUnackedPacketMap::OnRetransmittedPacket( |
&unacked_packets_[old_transmission - least_unacked_]; |
// Don't remove old packets if they're still in flight. |
if (!old_info->in_flight) { |
- transmission_info->all_transmissions->erase(old_transmission); |
+ old_info->all_transmissions->pop_front(); |
// This will cause the packet be removed in RemoveObsoletePackets. |
- old_info->all_transmissions = new SequenceNumberSet(); |
- old_info->all_transmissions->insert(old_transmission); |
+ old_info->all_transmissions = NULL; |
} |
} |
+ if (transmission_info->all_transmissions == NULL) { |
+ transmission_info->all_transmissions = new SequenceNumberList(); |
+ transmission_info->all_transmissions->push_back(old_sequence_number); |
+ } |
+ transmission_info->all_transmissions->push_back(new_sequence_number); |
unacked_packets_.push_back( |
TransmissionInfo(frames, |
- new_sequence_number, |
transmission_info->sequence_number_length, |
transmission_type, |
transmission_info->all_transmissions)); |
@@ -114,7 +117,7 @@ void QuicUnackedPacketMap::ClearPreviousRetransmissions(size_t num_to_clear) { |
break; |
} |
- info->all_transmissions->erase(least_unacked_); |
+ info->all_transmissions->pop_front(); |
LOG_IF(DFATAL, info->all_transmissions->empty()) |
<< "Previous retransmissions must have a newer transmission."; |
unacked_packets_.pop_front(); |
@@ -145,20 +148,19 @@ void QuicUnackedPacketMap::RemoveRetransmittability( |
DCHECK_GE(sequence_number, least_unacked_); |
DCHECK_LT(sequence_number, least_unacked_ + unacked_packets_.size()); |
TransmissionInfo* info = &unacked_packets_[sequence_number - least_unacked_]; |
- SequenceNumberSet* all_transmissions = info->all_transmissions; |
- if (all_transmissions->size() == 1) { |
+ SequenceNumberList* all_transmissions = info->all_transmissions; |
+ if (all_transmissions == NULL) { |
MaybeRemoveRetransmittableFrames(info); |
return; |
} |
// TODO(ianswett): Consider adding a check to ensure there are retransmittable |
// frames associated with this packet. |
- for (SequenceNumberSet::const_iterator it = all_transmissions->begin(); |
+ for (SequenceNumberList::const_iterator it = all_transmissions->begin(); |
it != all_transmissions->end(); ++it) { |
TransmissionInfo* transmission_info = |
&unacked_packets_[*it - least_unacked_]; |
MaybeRemoveRetransmittableFrames(transmission_info); |
- transmission_info->all_transmissions = new SequenceNumberSet(); |
- transmission_info->all_transmissions->insert(*it); |
+ transmission_info->all_transmissions = NULL; |
} |
delete all_transmissions; |
} |
@@ -187,7 +189,7 @@ bool QuicUnackedPacketMap::IsPacketUseless( |
return sequence_number <= largest_observed_ && |
!info.in_flight && |
info.retransmittable_frames == NULL && |
- info.all_transmissions->size() == 1; |
+ info.all_transmissions == NULL; |
} |
bool QuicUnackedPacketMap::IsUnacked( |